From e186de273b8e0a6a67b17b6a970ac86d990b6b01 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Wed, 7 Feb 2024 16:14:49 -0800 Subject: [PATCH 01/44] removing cookiecutter code: /js --- js/.prettierignore | 2 - js/.prettierrc.json | 1 - js/README.md | 14 - js/package-lock.json | 3010 ----------------------------------- js/package.json | 57 - js/src/embed.js | 20 - js/src/extension.js | 37 - js/src/index.js | 82 - js/src/jupyterlab-plugin.js | 26 - js/src/notebook.js | 14 - js/webpack.config.js | 54 - 11 files changed, 3317 deletions(-) delete mode 100644 js/.prettierignore delete mode 100644 js/.prettierrc.json delete mode 100644 js/README.md delete mode 100644 js/package-lock.json delete mode 100644 js/package.json delete mode 100644 js/src/embed.js delete mode 100644 js/src/extension.js delete mode 100644 js/src/index.js delete mode 100644 js/src/jupyterlab-plugin.js delete mode 100644 js/src/notebook.js delete mode 100644 js/webpack.config.js diff --git a/js/.prettierignore b/js/.prettierignore deleted file mode 100644 index f06235c4..00000000 --- a/js/.prettierignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -dist diff --git a/js/.prettierrc.json b/js/.prettierrc.json deleted file mode 100644 index 0967ef42..00000000 --- a/js/.prettierrc.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/js/README.md b/js/README.md deleted file mode 100644 index 34790eed..00000000 --- a/js/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Jupyter Widget Frontend Implementation for glvis-js - -Interactive finite element visualization widget for the Jupyter Notebook, -built with [GLVis](https://glvis.org). - -## Package Install - -**Prerequisites** - -- [node](http://nodejs.org/) - -```bash -npm install --save glvis-jupyter -``` diff --git a/js/package-lock.json b/js/package-lock.json deleted file mode 100644 index 25daca3a..00000000 --- a/js/package-lock.json +++ /dev/null @@ -1,3010 +0,0 @@ -{ - "name": "glvis-jupyter", - "version": "0.3.3", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "glvis-jupyter", - "version": "0.3.3", - "license": "BSD-3-Clause", - "dependencies": { - "@jupyter-widgets/base": "^6.0.2", - "glvis": "^0.2.4", - "lodash": "^4.17.21" - }, - "devDependencies": { - "@jupyterlab/builder": "^3.5.3", - "install": "^0.13.0", - "prettier": "2.2.1", - "rimraf": "^2.6.3", - "webpack": "^5", - "webpack-cli": "^4.3.1" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jupyter-widgets/base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@jupyter-widgets/base/-/base-6.0.2.tgz", - "integrity": "sha512-CIVjSTrqQFzkg9VCdDjrjDqwbba3eZfNigCPFSuKmMVXc+ATAOFczOv9/9uaCPzQ+E+0g6SOLhJ25SpKB0cl9g==", - "dependencies": { - "@jupyterlab/services": "^6.0.0", - "@lumino/coreutils": "^1.11.1", - "@lumino/messaging": "^1.10.1", - "@lumino/widgets": "^1.30.0", - "@types/backbone": "1.4.14", - "@types/lodash": "^4.14.134", - "backbone": "1.4.0", - "jquery": "^3.1.1", - "lodash": "^4.17.4" - } - }, - "node_modules/@jupyterlab/builder": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@jupyterlab/builder/-/builder-3.5.3.tgz", - "integrity": "sha512-N8Qw0XU5UxEAltwa58DkppRlkUJX7Nu034QNczlXWjaW0IIqc8ElAGZ0LGMIDMNAUgajccK+4Bm7D+duN1evKQ==", - "dev": true, - "dependencies": { - "@lumino/algorithm": "^1.9.0", - "@lumino/application": "^1.27.0", - "@lumino/commands": "^1.19.0", - "@lumino/coreutils": "^1.11.0", - "@lumino/disposable": "^1.10.0", - "@lumino/domutils": "^1.8.0", - "@lumino/dragdrop": "^1.13.0", - "@lumino/messaging": "^1.10.0", - "@lumino/properties": "^1.8.0", - "@lumino/signaling": "^1.10.0", - "@lumino/virtualdom": "^1.14.0", - "@lumino/widgets": "^1.33.0", - "ajv": "^6.12.3", - "commander": "~6.0.0", - "css-loader": "^5.0.1", - "duplicate-package-checker-webpack-plugin": "^3.0.0", - "file-loader": "~6.0.0", - "fs-extra": "^9.0.1", - "glob": "~7.1.6", - "license-webpack-plugin": "^2.3.14", - "mini-css-extract-plugin": "~1.3.2", - "path-browserify": "^1.0.0", - "process": "^0.11.10", - "raw-loader": "~4.0.0", - "style-loader": "~2.0.0", - "supports-color": "^7.2.0", - "svg-url-loader": "~6.0.0", - "terser-webpack-plugin": "^4.1.0", - "to-string-loader": "^1.1.6", - "url-loader": "~4.1.0", - "webpack": "^5.41.1", - "webpack-cli": "^4.1.0", - "webpack-merge": "^5.1.2", - "worker-loader": "^3.0.2" - }, - "bin": { - "build-labextension": "lib/build-labextension.js" - } - }, - "node_modules/@jupyterlab/coreutils": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@jupyterlab/coreutils/-/coreutils-5.5.3.tgz", - "integrity": "sha512-GCAymoQAwscE8MGH7eb366bRxvWawOXKFeyq642SAtl0/xWty8Kem56UfdUdyTCRzxwYW5r1sJuRHBvbTjnvUA==", - "dependencies": { - "@lumino/coreutils": "^1.11.0", - "@lumino/disposable": "^1.10.0", - "@lumino/signaling": "^1.10.0", - "minimist": "~1.2.0", - "moment": "^2.24.0", - "path-browserify": "^1.0.0", - "url-parse": "~1.5.1" - } - }, - "node_modules/@jupyterlab/nbformat": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@jupyterlab/nbformat/-/nbformat-3.5.3.tgz", - "integrity": "sha512-7HIdRXrm5BKrP4P1cT+b34BFiqmEcr5fJyyBW6nIm3DXh9ZNTKhQUN8vGvkL7qTXZFXmdhc//eTSZUPQ3F3JcA==", - "dependencies": { - "@lumino/coreutils": "^1.11.0" - } - }, - "node_modules/@jupyterlab/observables": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/@jupyterlab/observables/-/observables-4.5.3.tgz", - "integrity": "sha512-WERivf/gr2ZMGCXEiJpgv4AGVG8ovKzdg/tIgzrf72eB4Jq5WXMy4r5GLvM+g3PkiiG8o50C2t/SXcUlvNDTaw==", - "dependencies": { - "@lumino/algorithm": "^1.9.0", - "@lumino/coreutils": "^1.11.0", - "@lumino/disposable": "^1.10.0", - "@lumino/messaging": "^1.10.0", - "@lumino/signaling": "^1.10.0" - } - }, - "node_modules/@jupyterlab/services": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/@jupyterlab/services/-/services-6.5.3.tgz", - "integrity": "sha512-9wIVzKeAvgx9J0g9DoG96yauG+HU4/ms28DM+7iS34/akoHSM17czWGGnmKY0Y3MyZ22up7aZelCthP+WiAQxQ==", - "dependencies": { - "@jupyterlab/coreutils": "^5.5.3", - "@jupyterlab/nbformat": "^3.5.3", - "@jupyterlab/observables": "^4.5.3", - "@jupyterlab/settingregistry": "^3.5.3", - "@jupyterlab/statedb": "^3.5.3", - "@lumino/algorithm": "^1.9.0", - "@lumino/coreutils": "^1.11.0", - "@lumino/disposable": "^1.10.0", - "@lumino/polling": "^1.9.0", - "@lumino/signaling": "^1.10.0", - "node-fetch": "^2.6.0", - "ws": "^7.4.6" - } - }, - "node_modules/@jupyterlab/settingregistry": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@jupyterlab/settingregistry/-/settingregistry-3.5.3.tgz", - "integrity": "sha512-PWkISgGHikSaOEOiPVIDCcnLdiuXAcFdI7ZPLWoaq0v+NykemenQ5+MXOEaEOgf3KUAE8PFAGNr+3indbwFXNw==", - "dependencies": { - "@jupyterlab/statedb": "^3.5.3", - "@lumino/commands": "^1.19.0", - "@lumino/coreutils": "^1.11.0", - "@lumino/disposable": "^1.10.0", - "@lumino/signaling": "^1.10.0", - "ajv": "^6.12.3", - "json5": "^2.1.1" - } - }, - "node_modules/@jupyterlab/statedb": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@jupyterlab/statedb/-/statedb-3.5.3.tgz", - "integrity": "sha512-QlFLcSzOJUjjwiXjgv5dQVHTRXXBT5+e/kJKVLddi80li/p0hBmKQHP+9e15Ql+i599uyoE6zE7lyMRPHrO98w==", - "dependencies": { - "@lumino/commands": "^1.19.0", - "@lumino/coreutils": "^1.11.0", - "@lumino/disposable": "^1.10.0", - "@lumino/properties": "^1.8.0", - "@lumino/signaling": "^1.10.0" - } - }, - "node_modules/@lumino/algorithm": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@lumino/algorithm/-/algorithm-1.9.2.tgz", - "integrity": "sha512-Z06lp/yuhz8CtIir3PNTGnuk7909eXt4ukJsCzChsGuot2l5Fbs96RJ/FOHgwCedaX74CtxPjXHXoszFbUA+4A==" - }, - "node_modules/@lumino/application": { - "version": "1.31.3", - "resolved": "https://registry.npmjs.org/@lumino/application/-/application-1.31.3.tgz", - "integrity": "sha512-XnsXm5PD9QevJRl/pHJziYmhRKqJYjEOTL6Vh9dtKpPPML57uswOj59Pokxx/yCvym1xRF9iDVvujy3KallRwQ==", - "dev": true, - "dependencies": { - "@lumino/commands": "^1.21.1", - "@lumino/coreutils": "^1.12.1", - "@lumino/widgets": "^1.37.1" - } - }, - "node_modules/@lumino/collections": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@lumino/collections/-/collections-1.9.3.tgz", - "integrity": "sha512-2i2Wf1xnfTgEgdyKEpqM16bcYRIhUOGCDzaVCEZACVG9R1CgYwOe3zfn71slBQOVSjjRgwYrgLXu4MBpt6YK+g==", - "dependencies": { - "@lumino/algorithm": "^1.9.2" - } - }, - "node_modules/@lumino/commands": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/@lumino/commands/-/commands-1.21.1.tgz", - "integrity": "sha512-d1zJmwz5bHU0BM/Rl3tRdZ7/WgXnFB0bM7x7Bf0XDlmX++jnU9k0j3mh6/5JqCGLmIApKCRwVqSaV7jPmSJlcQ==", - "dependencies": { - "@lumino/algorithm": "^1.9.2", - "@lumino/coreutils": "^1.12.1", - "@lumino/disposable": "^1.10.4", - "@lumino/domutils": "^1.8.2", - "@lumino/keyboard": "^1.8.2", - "@lumino/signaling": "^1.11.1", - "@lumino/virtualdom": "^1.14.3" - } - }, - "node_modules/@lumino/coreutils": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@lumino/coreutils/-/coreutils-1.12.1.tgz", - "integrity": "sha512-JLu3nTHzJk9N8ohZ85u75YxemMrmDzJdNgZztfP7F7T7mxND3YVNCkJG35a6aJ7edu1sIgCjBxOvV+hv27iYvQ==", - "peerDependencies": { - "crypto": "1.0.1" - } - }, - "node_modules/@lumino/disposable": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@lumino/disposable/-/disposable-1.10.4.tgz", - "integrity": "sha512-4ZxyYcyzUS+ZeB2KAH9oAH3w0DUUceiVr+FIZHZ2TAYGWZI/85WlqJtfm0xjwEpCwLLW1TDqJrISuZu3iMmVMA==", - "dependencies": { - "@lumino/algorithm": "^1.9.2", - "@lumino/signaling": "^1.11.1" - } - }, - "node_modules/@lumino/domutils": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@lumino/domutils/-/domutils-1.8.2.tgz", - "integrity": "sha512-QIpMfkPJrs4GrWBuJf2Sn1fpyVPmvqUUAeD8xAQo8+4V5JAT0vUDLxZ9HijefMgNCi3+Bs8Z3lQwRCrz+cFP1A==" - }, - "node_modules/@lumino/dragdrop": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/@lumino/dragdrop/-/dragdrop-1.14.4.tgz", - "integrity": "sha512-IHX2M8Yqs2YsFHHXKSKiYLgv9DEuhyyKoDS85Chg34J9OaPC5ocT0AmNVnpeq9T4A50sg3vdL9mSRCZ0f302Gw==", - "dependencies": { - "@lumino/coreutils": "^1.12.1", - "@lumino/disposable": "^1.10.4" - } - }, - "node_modules/@lumino/keyboard": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@lumino/keyboard/-/keyboard-1.8.2.tgz", - "integrity": "sha512-Dy+XqQ1wXbcnuYtjys5A0pAqf4SpAFl9NY6owyIhXAo0Va7w3LYp3jgiP1xAaBAwMuUppiUAfrbjrysZuZ625g==" - }, - "node_modules/@lumino/messaging": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@lumino/messaging/-/messaging-1.10.3.tgz", - "integrity": "sha512-F/KOwMCdqvdEG8CYAJcBSadzp6aI7a47Fr60zAKGqZATSRRRV41q53iXU7HjFPqQqQIvdn9Z7J32rBEAyQAzww==", - "dependencies": { - "@lumino/algorithm": "^1.9.2", - "@lumino/collections": "^1.9.3" - } - }, - "node_modules/@lumino/polling": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@lumino/polling/-/polling-1.11.4.tgz", - "integrity": "sha512-yC7JLssj3mqVK6TsYj7dg4AG0rcsC42YtpoDLtz9yzO84Q5flQUfmjAPQB6oPA6wZOlISs3iasF+uO2w1ls5jg==", - "dependencies": { - "@lumino/coreutils": "^1.12.1", - "@lumino/disposable": "^1.10.4", - "@lumino/signaling": "^1.11.1" - } - }, - "node_modules/@lumino/properties": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@lumino/properties/-/properties-1.8.2.tgz", - "integrity": "sha512-EkjI9Cw8R0U+xC9HxdFSu7X1tz1H1vKu20cGvJ2gU+CXlMB1DvoYJCYxCThByHZ+kURTAap4SE5x8HvKwNPbig==" - }, - "node_modules/@lumino/signaling": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@lumino/signaling/-/signaling-1.11.1.tgz", - "integrity": "sha512-YCUmgw08VoyMN5KxzqPO3KMx+cwdPv28tAN06C0K7Q/dQf+oufb1XocuhZb5selTrTmmuXeizaYxgLIQGdS1fA==", - "dependencies": { - "@lumino/algorithm": "^1.9.2", - "@lumino/properties": "^1.8.2" - } - }, - "node_modules/@lumino/virtualdom": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@lumino/virtualdom/-/virtualdom-1.14.3.tgz", - "integrity": "sha512-5joUC1yuxeXbpfbSBm/OR8Mu9HoTo6PDX0RKqzlJ9o97iml7zayFN/ynzcxScKGQAo9iaXOY8uVIvGUT8FnsGw==", - "dependencies": { - "@lumino/algorithm": "^1.9.2" - } - }, - "node_modules/@lumino/widgets": { - "version": "1.37.1", - "resolved": "https://registry.npmjs.org/@lumino/widgets/-/widgets-1.37.1.tgz", - "integrity": "sha512-/whz5B/hL0fjv0bR8JYZ+Emx+CH7HBwXc4TqI9PrrHGm3g6+jRJAyIFGZcQubqkPxxHrRE/VxQgoDKGhINw/Gw==", - "dependencies": { - "@lumino/algorithm": "^1.9.2", - "@lumino/commands": "^1.21.1", - "@lumino/coreutils": "^1.12.1", - "@lumino/disposable": "^1.10.4", - "@lumino/domutils": "^1.8.2", - "@lumino/dragdrop": "^1.14.4", - "@lumino/keyboard": "^1.8.2", - "@lumino/messaging": "^1.10.3", - "@lumino/properties": "^1.8.2", - "@lumino/signaling": "^1.11.1", - "@lumino/virtualdom": "^1.14.3" - } - }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file/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/@types/backbone": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@types/backbone/-/backbone-1.4.14.tgz", - "integrity": "sha512-85ldQ99fiYTJFBlZuAJRaCdvTZKZ2p1fSs3fVf+6Ub6k1X0g0hNJ0qJ/2FOByyyAQYLtbEz3shX5taKQfBKBDw==", - "dependencies": { - "@types/jquery": "*", - "@types/underscore": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/@types/jquery": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", - "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", - "dependencies": { - "@types/sizzle": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" - }, - "node_modules/@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true - }, - "node_modules/@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" - }, - "node_modules/@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", - "dev": true - }, - "node_modules/@types/underscore": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz", - "integrity": "sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg==" - }, - "node_modules/@types/webpack-sources": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz", - "integrity": "sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.6.1" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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-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-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "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/backbone": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.4.0.tgz", - "integrity": "sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ==", - "dependencies": { - "underscore": ">=1.8.3" - } - }, - "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==", - "dev": true - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "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/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "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/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/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/caniuse-lite": { - "version": "1.0.30001449", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz", - "integrity": "sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "node_modules/commander": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.0.0.tgz", - "integrity": "sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "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/crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", - "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.", - "peer": true - }, - "node_modules/css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/duplicate-package-checker-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/duplicate-package-checker-webpack-plugin/-/duplicate-package-checker-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-aO50/qPC7X2ChjRFniRiscxBLT/K01bALqfcDaf8Ih5OqQ1N4iT/Abx9Ofu3/ms446vHTm46FACIuJUmgUQcDQ==", - "dev": true, - "dependencies": { - "chalk": "^2.3.0", - "find-root": "^1.0.0", - "lodash": "^4.17.4", - "semver": "^5.4.1" - } - }, - "node_modules/duplicate-package-checker-webpack-plugin/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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/esrecurse/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/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "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-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==" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/file-loader": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", - "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/glvis": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/glvis/-/glvis-0.2.4.tgz", - "integrity": "sha512-NcF7uSNVB/pe84UENVz0Q32dZqZmortwW4ejNo1u+b9tsIkQ5vTNfSn0jnAt0muViY32/iJRaeWMD0f5oKfoqw==" - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "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/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "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/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/install": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", - "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jquery": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", - "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "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==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "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/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/license-webpack-plugin": { - "version": "2.3.21", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.21.tgz", - "integrity": "sha512-rVaYU9TddZN3ao8M/0PrRSCdTp2EW6VQymlgsuScld1vef0Ou7fALx3ePe83KLP3xAEDcPK5fkqUVqGBnbz1zQ==", - "dev": true, - "dependencies": { - "@types/webpack-sources": "^0.1.5", - "webpack-sources": "^1.2.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "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==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "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/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.9.tgz", - "integrity": "sha512-Ac4s+xhVbqlyhXS5J/Vh/QXUz3ycXlCqoCPpg0vdfhsIBH9eg/It/9L1r1XhSCH737M1lqcWnMuWL13zcygn5A==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "webpack-sources": "^1.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.0.0" - } - }, - "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/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "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==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "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==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "engines": { - "node": "*" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz", - "integrity": "sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "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==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "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/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prettier": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", - "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.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==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/raw-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", - "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.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-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "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==", - "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/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "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/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "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-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "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/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/style-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.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==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-url-loader": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/svg-url-loader/-/svg-url-loader-6.0.0.tgz", - "integrity": "sha512-Qr5SCKxyxKcRnvnVrO3iQj9EX/v40UiGEMshgegzV7vpo3yc+HexELOdtWcA3MKjL8IyZZ1zOdcILmDEa/8JJQ==", - "dev": true, - "dependencies": { - "file-loader": "~6.0.0", - "loader-utils": "~2.0.0" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", - "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser": { - "version": "5.16.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.1.tgz", - "integrity": "sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", - "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", - "dev": true, - "dependencies": { - "cacache": "^15.0.5", - "find-cache-dir": "^3.3.1", - "jest-worker": "^26.5.0", - "p-limit": "^3.0.2", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1", - "source-map": "^0.6.1", - "terser": "^5.3.4", - "webpack-sources": "^1.4.3" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/to-string-loader": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/to-string-loader/-/to-string-loader-1.2.0.tgz", - "integrity": "sha512-KsWUL8FccgBW9FPFm4vYoQbOOcO5m6hKOGYoXjbseD9/4Ft+ravXN5jolQ9kTKYcK4zPt1j+khx97GPGnVoi6A==", - "dev": true, - "dependencies": { - "loader-utils": "^1.0.0" - } - }, - "node_modules/to-string-loader/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/to-string-loader/node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "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-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "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==", - "dev": true - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/webpack": { - "version": "5.76.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.0.tgz", - "integrity": "sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/webpack/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/webpack/node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/webpack/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "node_modules/worker-loader": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz", - "integrity": "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "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==", - "dev": true - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/js/package.json b/js/package.json deleted file mode 100644 index a11d861a..00000000 --- a/js/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "glvis-jupyter", - "version": "0.3.3", - "description": "Jupyter Widget using glvis-js", - "author": "", - "license": "BSD-3-Clause", - "main": "src/index.js", - "repository": { - "type": "git", - "url": "https://github.com/glvis/pyglvis.git" - }, - "keywords": [ - "jupyter", - "widgets", - "ipython", - "ipywidgets", - "jupyterlab-extension", - "finite-elements", - "visualization", - "computational-science", - "data-vis", - "glvis", - "glvis-js", - "mfem" - ], - "scripts": { - "build": "webpack", - "build3": "webpack && npm run build:labextension", - "build:labextension": "jupyter labextension build .", - "clean": "rimraf dist/ && rimraf ../glvis/labextension/ && rimraf ../glvis/nbextension", - "prepublishOnly": "npm run clean && npm run build", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "devDependencies": { - "@jupyterlab/builder": "^3.5.3", - "install": "^0.13.0", - "prettier": "2.2.1", - "rimraf": "^2.6.3", - "webpack": "^5", - "webpack-cli": "^4.3.1" - }, - "dependencies": { - "@jupyter-widgets/base": "^6.0.2", - "glvis": "^0.2.4", - "lodash": "^4.17.21" - }, - "jupyterlab": { - "extension": "src/jupyterlab-plugin", - "outputDir": "../glvis-jupyter/labextension", - "sharedPackages": { - "@jupyter-widgets/base": { - "bundled": false, - "singleton": true - } - } - } -} diff --git a/js/src/embed.js b/js/src/embed.js deleted file mode 100644 index de7ad0f6..00000000 --- a/js/src/embed.js +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 2010-2021, Lawrence Livermore National Security, LLC. Produced -// at the Lawrence Livermore National Laboratory. All Rights reserved. See files -// LICENSE and NOTICE for details. LLNL-CODE-443271. -// -// This file is part of the GLVis visualization tool and library. For more -// information and source code availability see https://glvis.org. -// -// GLVis is free software; you can redistribute it and/or modify it under the -// terms of the BSD-3 license. We welcome feedback and contributions, see file -// CONTRIBUTING.md for details. - -// Entry point for the unpkg bundle containing custom model definitions. - -// It differs from the notebook bundle in that it does not need to define a -// dynamic baseURL for the static assets and may load some css that would -// already be loaded by the notebook otherwise. - -// Export widget models and views, and the npm package version number. -module.exports = require("./index.js"); -module.exports["version"] = require("../package.json").version; diff --git a/js/src/extension.js b/js/src/extension.js deleted file mode 100644 index 0dbe0a54..00000000 --- a/js/src/extension.js +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2010-2021, Lawrence Livermore National Security, LLC. Produced -// at the Lawrence Livermore National Laboratory. All Rights reserved. See files -// LICENSE and NOTICE for details. LLNL-CODE-443271. -// -// This file is part of the GLVis visualization tool and library. For more -// information and source code availability see https://glvis.org. -// -// GLVis is free software; you can redistribute it and/or modify it under the -// terms of the BSD-3 license. We welcome feedback and contributions, see file -// CONTRIBUTING.md for details. - -// This file contains the javascript that is run when the notebook is loaded. -// It contains some requirejs configuration and the `load_ipython_extension` -// which is required for any notebook extension. - -// Some static assets may be required by the custom widget javascript. The base -// url for the notebook is not known at build time and is therefore computed -// dynamically. -__webpack_public_path__ = - document.querySelector("body").getAttribute("data-base-url") + - "nbextensions/glvis-jupyter"; - -// Configure requirejs -if (window.require) { - window.require.config({ - map: { - "*": { - "glvis-jupyter": "nbextensions/glvis-jupyter/index", - }, - }, - }); -} - -// Export the required load_ipython_extension -module.exports = { - load_ipython_extension: function () {}, -}; diff --git a/js/src/index.js b/js/src/index.js deleted file mode 100644 index 84e47af7..00000000 --- a/js/src/index.js +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2010-2021, Lawrence Livermore National Security, LLC. Produced -// at the Lawrence Livermore National Laboratory. All Rights reserved. See files -// LICENSE and NOTICE for details. LLNL-CODE-443271. -// -// This file is part of the GLVis visualization tool and library. For more -// information and source code availability see https://glvis.org. -// -// GLVis is free software; you can redistribute it and/or modify it under the -// terms of the BSD-3 license. We welcome feedback and contributions, see file -// CONTRIBUTING.md for details. - -var widgets = require("@jupyter-widgets/base"); -var glvis = require("glvis"); -var lodash = require("lodash"); -var version = require("../package.json").version; - -var GLVisModel = widgets.DOMWidgetModel.extend({ - defaults: lodash.extend(widgets.DOMWidgetModel.prototype.defaults(), { - _model_name: "GLVisModel", - _model_module: "glvis-jupyter", - _model_module_version: "^" + version, - - _view_name: "GLVisView", - _view_module: "glvis-jupyter", - _view_module_version: "^" + version, - }), -}); - -var GLVisView = widgets.DOMWidgetView.extend({ - render: function () { - this.div = document.createElement("div"); - this.div.setAttribute("id", glvis.rand_id()); - this.div.setAttribute("tabindex", "0"); - this.el.append(this.div); - this.width = this.model.get("width"); - this.height = this.model.get("height"); - - this.glv = new glvis.State(this.div, this.width, this.height); - this.model.on("change:data_str", this.plot, this); - this.model.on("change:height", this.set_size, this); - this.model.on("change:width", this.set_size, this); - this.model.on("msg:custom", this.handle_message, this); - this.plot(); - }, - - handle_message: function (msg, buffers) { - if (msg.type === "screenshot") { - if (msg.use_web) { - this.glv.saveScreenshot(msg.name); - } else { - let that = this; - this.glv.getPNGAsB64().then((v) => { - that.send({ type: "screenshot", name: msg.name, b64: v }); - }); - } - } - }, - - set_size: function () { - const width = this.model.get("width"); - const height = this.model.get("height"); - this.glv.setSize(width, height); - }, - - plot: function () { - const type = this.model.get("data_type"); - const data = this.model.get("data_str"); - - const is_new_stream = this.model.get("is_new_stream"); - if (is_new_stream) { - this.glv.display(type, data); - } else { - this.glv.update(type, data); - } - }, -}); - -module.exports = { - GLVisModel: GLVisModel, - GLVisView: GLVisView, - version: version, -}; diff --git a/js/src/jupyterlab-plugin.js b/js/src/jupyterlab-plugin.js deleted file mode 100644 index e2afccfd..00000000 --- a/js/src/jupyterlab-plugin.js +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2010-2021, Lawrence Livermore National Security, LLC. Produced -// at the Lawrence Livermore National Laboratory. All Rights reserved. See files -// LICENSE and NOTICE for details. LLNL-CODE-443271. -// -// This file is part of the GLVis visualization tool and library. For more -// information and source code availability see https://glvis.org. -// -// GLVis is free software; you can redistribute it and/or modify it under the -// terms of the BSD-3 license. We welcome feedback and contributions, see file -// CONTRIBUTING.md for details. - -var glvis_jupyter = require("./index"); -var base = require("@jupyter-widgets/base"); - -module.exports = { - id: "jupyter.extensions.glvis-jupyter", - requires: [base.IJupyterWidgetRegistry], - activate: function (app, widgets) { - widgets.registerWidget({ - name: "glvis-jupyter", - version: glvis_jupyter.version, - exports: glvis_jupyter, - }); - }, - autoStart: true, -}; diff --git a/js/src/notebook.js b/js/src/notebook.js deleted file mode 100644 index f1c2365a..00000000 --- a/js/src/notebook.js +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) 2010-2021, Lawrence Livermore National Security, LLC. Produced -// at the Lawrence Livermore National Laboratory. All Rights reserved. See files -// LICENSE and NOTICE for details. LLNL-CODE-443271. -// -// This file is part of the GLVis visualization tool and library. For more -// information and source code availability see https://glvis.org. -// -// GLVis is free software; you can redistribute it and/or modify it under the -// terms of the BSD-3 license. We welcome feedback and contributions, see file -// CONTRIBUTING.md for details. - -// Export widget models and views, and the npm package version number. -module.exports = require("./index.js"); -module.exports["version"] = require("../package.json").version; diff --git a/js/webpack.config.js b/js/webpack.config.js deleted file mode 100644 index 487c4d2b..00000000 --- a/js/webpack.config.js +++ /dev/null @@ -1,54 +0,0 @@ -//var fs = require("fs-extra"); -var path = require("path"); -var version = require("./package.json").version; - -// Custom webpack rules are generally the same for all webpack bundles, hence -// stored in a separate local variable. -var rules = [{ test: /\.css$/, use: ["style-loader", "css-loader"] }]; - -// TODO: copy package.json so we can grab its version in glvis -module.exports = [ - { - // Notebook extension - entry: "./src/extension.js", - mode: "production", - output: { - filename: "extension.js", - path: path.resolve(__dirname, "..", "glvis", "nbextension"), - libraryTarget: "amd", - publicPath: "", - }, - }, - { - // glvis-jupyter bundle for the classic notebook - entry: "./src/notebook.js", - mode: "production", - output: { - filename: "index.js", - path: path.resolve(__dirname, "..", "glvis", "nbextension"), - libraryTarget: "amd", - publicPath: "", - }, - devtool: "source-map", - module: { - rules: rules, - }, - externals: ["@jupyter-widgets/base"], - }, - { - // glvis-jupyter bundle for unpkg - entry: "./src/embed.js", - mode: "production", - output: { - filename: "index.js", - path: path.resolve(__dirname, "dist"), - libraryTarget: "amd", - publicPath: "https://unpkg.com/glvis-jupyter@" + version + "/dist/", - }, - devtool: "source-map", - module: { - rules: rules, - }, - externals: ["@jupyter-widgets/base"], - }, -]; From 53bca50ad609b3ae6eaea740608640937c45a080 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Wed, 7 Feb 2024 16:16:30 -0800 Subject: [PATCH 02/44] removing cookiecutter code: other --- glvis-jupyter.json | 5 -- glvis/__init__.py | 24 ---------- glvis/_version.py | 3 -- glvis/widget.py | 112 --------------------------------------------- makefile | 22 --------- 5 files changed, 166 deletions(-) delete mode 100644 glvis-jupyter.json delete mode 100644 glvis/__init__.py delete mode 100644 glvis/_version.py delete mode 100644 glvis/widget.py delete mode 100644 makefile diff --git a/glvis-jupyter.json b/glvis-jupyter.json deleted file mode 100644 index 4c25593c..00000000 --- a/glvis-jupyter.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "load_extensions": { - "glvis-jupyter/extension": true - } -} diff --git a/glvis/__init__.py b/glvis/__init__.py deleted file mode 100644 index 8915c05d..00000000 --- a/glvis/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) 2010-2021, Lawrence Livermore National Security, LLC. Produced -# at the Lawrence Livermore National Laboratory. All Rights reserved. See files -# LICENSE and NOTICE for details. LLNL-CODE-443271. -# -# This file is part of the GLVis visualization tool and library. For more -# information and source code availability see https://glvis.org. -# -# GLVis is free software; you can redistribute it and/or modify it under the -# terms of the BSD-3 license. We welcome feedback and contributions, see file -# CONTRIBUTING.md for details. - -from ._version import version_info, __version__ -from .widget import glvis, to_stream - - -def _jupyter_nbextension_paths(): - return [ - { - "section": "notebook", - "src": "nbextension", - "dest": "glvis-jupyter", - "require": "glvis-jupyter/extension", - } - ] diff --git a/glvis/_version.py b/glvis/_version.py deleted file mode 100644 index d1eab5a1..00000000 --- a/glvis/_version.py +++ /dev/null @@ -1,3 +0,0 @@ -version_info = (0, 3, 3) -__version__ = ".".join(map(str, version_info)) -extension_version = "0.3.3" diff --git a/glvis/widget.py b/glvis/widget.py deleted file mode 100644 index a630af67..00000000 --- a/glvis/widget.py +++ /dev/null @@ -1,112 +0,0 @@ -# Copyright (c) 2010-2021, Lawrence Livermore National Security, LLC. Produced -# at the Lawrence Livermore National Laboratory. All Rights reserved. See files -# LICENSE and NOTICE for details. LLNL-CODE-443271. -# -# This file is part of the GLVis visualization tool and library. For more -# information and source code availability see https://glvis.org. -# -# GLVis is free software; you can redistribute it and/or modify it under the -# terms of the BSD-3 license. We welcome feedback and contributions, see file -# CONTRIBUTING.md for details. - -import io -import ipywidgets as widgets -from IPython.display import display as ipydisplay -from traitlets import Unicode, Int, Bool -from typing import Union, Tuple -from ._version import extension_version -import base64 - -try: - from mfem._ser.mesh import Mesh - from mfem._ser.gridfunc import GridFunction -except ImportError: - Mesh = object - GridFunction = object - -Stream = Union[Tuple[Mesh, GridFunction], Mesh, str] - - -def to_stream(mesh: Mesh, gf: GridFunction = None) -> str: - sio = io.StringIO() - sio.write("solution\n" if gf is not None else "mesh\n") - mesh.WriteToStream(sio) - if gf: - gf.WriteToStream(sio) - return sio.getvalue() - - -@widgets.register -class glvis(widgets.DOMWidget): - _model_name = Unicode("GLVisModel").tag(sync=True) - _model_module = Unicode("glvis-jupyter").tag(sync=True) - _model_module_version = Unicode("^" + extension_version).tag(sync=True) - - _view_name = Unicode("GLVisView").tag(sync=True) - _view_module = Unicode("glvis-jupyter").tag(sync=True) - _view_module_version = Unicode("^" + extension_version).tag(sync=True) - - data_str = Unicode().tag(sync=True) - data_type = Unicode().tag(sync=True) - width = Int().tag(sync=True) - height = Int().tag(sync=True) - is_new_stream = Bool().tag(sync=True) - - def _sync(self, data: Stream, is_new: bool = True): - self.is_new_stream = is_new - if isinstance(data, str): - stream = data - elif isinstance(data, tuple): - stream = to_stream(*data) - elif isinstance(data, Mesh): - stream = to_stream(data) - else: - raise TypeError - offset = stream.find("\n") - self.data_type = stream[0:offset] - self.data_str = stream[offset + 1:] - - def _on_msg(self, _, content, buffers): - if content.get("type", "") == "screenshot": - data = content.get("b64", "") - name = content.get("name", "glvis.png") - if not data: - print(f"unable to save {name}, bad data") - return - with open(name, "wb") as f: - f.write(base64.decodebytes(data.encode('ascii'))) - - def __init__( - self, data: Stream, width: int = 640, height: int = 480, *args, **kwargs - ): - widgets.DOMWidget.__init__(self, *args, **kwargs) - self.set_size(width, height) - self._sync(data, is_new=True) - self.on_msg(self._on_msg) - - def plot(self, data: Stream): - self._sync(data, is_new=True) - - def update(self, data: Stream): - self._sync(data, is_new=False) - - def set_size(self, width: int, height: int): - self.width = width - self.height = height - - def render(self): - ipydisplay(self) - - def screenshot(self, name, use_web=False): - self.send({"type": "screenshot", "name": name, "use_web": use_web}) - - def serialize(self): - """Return dict that can be used to construct a copy of this instance - - glvis(**other.serialize()) - """ - return { - "data": self.data_type + "\n" + self.data_str, - "width": self.width, - "height": self.height, - } diff --git a/makefile b/makefile deleted file mode 100644 index 0174cc0b..00000000 --- a/makefile +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2010-2021, Lawrence Livermore National Security, LLC. Produced -# at the Lawrence Livermore National Laboratory. All Rights reserved. See files -# LICENSE and NOTICE for details. LLNL-CODE-443271. -# -# This file is part of the GLVis visualization tool and library. For more -# information and source code availability see https://glvis.org. -# -# GLVis is free software; you can redistribute it and/or modify it under the -# terms of the BSD-3 license. We welcome feedback and contributions, see file -# CONTRIBUTING.md for details. - -NPX ?= npx -BLACK ?= black - -.PHONY: style - -style: - @which $(NPX) > /dev/null && (cd js && $(NPX) prettier -w .) || echo "fatal: $(NPX) isn't available, please install npm to format JavaScript." - @which $(BLACK) > /dev/null && $(BLACK) . || echo "fatal: $(BLACK) isn't available, please install black to format Python." - -clean: - rm -rf js/node_modules js/dist glvis/nbextension glvis.egg-info From 85958dfc4cbeb219f3ebe8308b4255ed6013a8da Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Wed, 7 Feb 2024 16:18:26 -0800 Subject: [PATCH 03/44] removing cookiecutter code: more misc --- MANIFEST.in | 2 - setup.cfg | 2 - setup.py | 176 ---------------------------------------------------- 3 files changed, 180 deletions(-) delete mode 100644 MANIFEST.in delete mode 100644 setup.cfg delete mode 100644 setup.py diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 49de9bf2..00000000 --- a/MANIFEST.in +++ /dev/null @@ -1,2 +0,0 @@ -recursive-include glvis/nbextension *.* -include glvis-jupyter.json diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 3c6e79cf..00000000 --- a/setup.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[bdist_wheel] -universal=1 diff --git a/setup.py b/setup.py deleted file mode 100644 index d8ab1f6b..00000000 --- a/setup.py +++ /dev/null @@ -1,176 +0,0 @@ -# Copyright (c) 2010-2021, Lawrence Livermore National Security, LLC. Produced -# at the Lawrence Livermore National Laboratory. All Rights reserved. See files -# LICENSE and NOTICE for details. LLNL-CODE-443271. -# -# This file is part of the GLVis visualization tool and library. For more -# information and source code availability see https://glvis.org. -# -# GLVis is free software; you can redistribute it and/or modify it under the -# terms of the BSD-3 license. We welcome feedback and contributions, see file -# CONTRIBUTING.md for details. - -from __future__ import print_function -from distutils import log -import os -import platform -from setuptools import setup, find_packages, Command -from setuptools.command.sdist import sdist -from setuptools.command.build_py import build_py -from setuptools.command.egg_info import egg_info -from subprocess import check_call -import sys - -name = "glvis" -long_description = "Jupyter Widget for GLVis" - -here = os.path.dirname(os.path.abspath(__file__)) -node_root = os.path.join(here, "js") -is_repo = os.path.exists(os.path.join(here, ".git")) - -npm_path = os.pathsep.join( - [ - os.path.join(node_root, "node_modules", ".bin"), - os.environ.get("PATH", os.defpath), - ] -) - -log.set_verbosity(log.DEBUG) -log.info("setup.py entered") -log.info("$PATH=%s" % os.environ["PATH"]) - - -def js_prerelease(command, strict=False): - """decorator for building minified js/css prior to another command""" - - class DecoratedCommand(command): - def run(self): - jsdeps = self.distribution.get_command_obj("jsdeps") - if not is_repo and all(os.path.exists(t) for t in jsdeps.targets): - # sdist, nothing to do - command.run(self) - return - - try: - self.distribution.run_command("jsdeps") - except Exception as e: - missing = [t for t in jsdeps.targets if not os.path.exists(t)] - if strict or missing: - log.warn("rebuilding js and css failed") - if missing: - log.error("missing files: %s" % missing) - raise e - else: - log.warn("rebuilding js and css failed (not a problem)") - log.warn(str(e)) - command.run(self) - update_package_data(self.distribution) - - return DecoratedCommand - - -def update_package_data(distribution): - """update package_data to catch changes during setup""" - build_py = distribution.get_command_obj("build_py") - # distribution.package_data = find_package_data() - # re-init build_py options which load package_data - build_py.finalize_options() - - -class NPM(Command): - description = "install package.json dependencies using npm" - - user_options = [] - - node_modules = os.path.join(node_root, "node_modules") - - targets = [ - os.path.join(here, "glvis", "nbextension", "extension.js"), - os.path.join(here, "glvis", "nbextension", "index.js"), - # os.path.join(here, "glvis", "nbextension", "package.json"), - ] - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def has_npm(self): - try: - check_call(["npm", "--version"]) - return True - except Exception: - return False - - def run(self): - if not self.has_npm(): - log.error( - "`npm` unavailable. If you're running this command using sudo, make sure" - "`npm` is available to sudo" - ) - return - - env = os.environ.copy() - env["PATH"] = npm_path - - log.info("Installing build dependencies with npm. This may take a while...") - check_call( - ["npm", "install"], cwd=node_root, stdout=sys.stdout, stderr=sys.stderr - ) - check_call( - ["npx", "webpack"], cwd=node_root, stdout=sys.stdout, stderr=sys.stderr - ) - os.utime(self.node_modules, None) - - for t in self.targets: - if not os.path.exists(t): - msg = "Missing file: %s" % t - raise ValueError(msg) - - # update package data in case this created new files - update_package_data(self.distribution) - - -version_ns = {} -with open(os.path.join(here, "glvis", "_version.py")) as f: - exec(f.read(), {}, version_ns) - -setup_args = { - "name": name, - "version": version_ns["__version__"], - "description": "Jupyter Widget using glvis-js", - "long_description": long_description, - "include_package_data": True, - "data_files": [ - ( - "share/jupyter/nbextensions/glvis-jupyter", - [ - "glvis/nbextension/extension.js", - "glvis/nbextension/index.js", - "glvis/nbextension/index.js.map", - # "glvis/nbextension/package.json", - ], - ), - ("etc/jupyter/nbconfig/notebook.d", ["glvis-jupyter.json"]), - ], - "install_requires": ["ipywidgets>=7.0.0", "traittypes>=0.2.1"], - "packages": find_packages(), - "zip_safe": False, - "cmdclass": { - "build_py": js_prerelease(build_py), - "egg_info": js_prerelease(egg_info), - "sdist": js_prerelease(sdist, strict=True), - "jsdeps": NPM, - }, - "author": "", - "author_email": "", - "url": "https://github.com/glvis/pyglvis", - "keywords": ["ipython", "jupyter", "widgets", "glvis", "mfem"], - "classifiers": [ - "Framework :: IPython", - "Topic :: Multimedia :: Graphics", - "Programming Language :: Python :: 3", - ], -} - -setup(**setup_args) From b6896b8254849156b00281c13b684eeb3a6749b9 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Wed, 7 Feb 2024 16:18:40 -0800 Subject: [PATCH 04/44] update copyright year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index ed91693f..c927547f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2010-2021, Lawrence Livermore National Security, LLC +Copyright (c) 2010-2024, Lawrence Livermore National Security, LLC All rights reserved. Redistribution and use in source and binary forms, with or without From 734a4241672abe0f79469ae692d393480cbc3d7b Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Wed, 7 Feb 2024 16:20:44 -0800 Subject: [PATCH 05/44] initial widget --- src/widget.js | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/widget.js diff --git a/src/widget.js b/src/widget.js new file mode 100644 index 00000000..d6bc7be4 --- /dev/null +++ b/src/widget.js @@ -0,0 +1,49 @@ +// _esm = """ +import glvis from "https://esm.sh/glvis"; + +function render({ model, el }) { + let div = document.createElement("div"); + div.setAttribute("id", glvis.rand_id()); + div.setAttribute("tabindex", "0"); + el.append(div); + + let width = () => model.get("width"); + let height = () => model.get("height"); + let glv = new glvis.State(div, width(), height()); + + function set_size() { + glv.setSize(width(), height()); + } + + function plot() { + const type = model.get("data_type"); + const data = model.get("data_str"); + const is_new_stream = model.get("is_new_stream"); + if (is_new_stream) { + glv.display(type, data); + } else { + glv.update(type, data); + } + } + + function handle_message(msg, buffers) { + if (msg.type === "screenshot") { + if (msg.use_web) { + glv.saveScreenshot(msg.name); + } else { + glv.getPNGAsB64().then((v) => { + model.send({ type: "screenshot", name: msg.name, b64: v }); + }); + } + } + } + + // update + model.on("change:width", set_size); + model.on("change:height", set_size); + model.on("change:data_str", plot); + model.on("msg:custom", handle_message); + plot(); +} + +export default { render }; \ No newline at end of file From 6ceb59cb6d5c4d919d63ba132357c85ec1d9522b Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Wed, 7 Feb 2024 16:45:47 -0800 Subject: [PATCH 06/44] fixing bug due to oudated function arguments of 'display' and 'update' defined in glvis-js/src/index.js --- src/widget.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widget.js b/src/widget.js index d6bc7be4..611c9795 100644 --- a/src/widget.js +++ b/src/widget.js @@ -20,9 +20,9 @@ function render({ model, el }) { const data = model.get("data_str"); const is_new_stream = model.get("is_new_stream"); if (is_new_stream) { - glv.display(type, data); + glv.display(data); } else { - glv.update(type, data); + glv.update(data); } } From 31d75c18f3f27646a8dca6b4863037c7c3398b11 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Wed, 7 Feb 2024 17:27:20 -0800 Subject: [PATCH 07/44] initial commit of basic python class --- src/widget.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/widget.py diff --git a/src/widget.py b/src/widget.py new file mode 100644 index 00000000..1e5068e8 --- /dev/null +++ b/src/widget.py @@ -0,0 +1,14 @@ +import anywidget +import io +from traitlets import Unicode, Int, Bool + +# Import file contents example: https://github.com/juba/pyobsplot/blob/main/src/pyobsplot/widget.py +class GLVis(anywidget.AnyWidget): + _esm = anywidget._file_contents.FileContents("widget.js", start_thread=False) + + data_str = Unicode('').tag(sync=True) + data_type = Unicode('').tag(sync=True) + width = Int(640).tag(sync=True) + height = Int(480).tag(sync=True) + is_new_stream = Bool().tag(sync=True) + From f5f14e29f6c560c38a5e1d60a0076b5cb8dffc26 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 12:25:50 -0800 Subject: [PATCH 08/44] renamed src to glvis --- {src => glvis}/widget.js | 0 {src => glvis}/widget.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {src => glvis}/widget.js (100%) rename {src => glvis}/widget.py (100%) diff --git a/src/widget.js b/glvis/widget.js similarity index 100% rename from src/widget.js rename to glvis/widget.js diff --git a/src/widget.py b/glvis/widget.py similarity index 100% rename from src/widget.py rename to glvis/widget.py From 47312c5dcb0bf0dd8d8af5021285bcc0a91e1bb4 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 12:36:05 -0800 Subject: [PATCH 09/44] __init__.py --- glvis/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 glvis/__init__.py diff --git a/glvis/__init__.py b/glvis/__init__.py new file mode 100644 index 00000000..e69de29b From f94e8acce365d8e2bc3fbe852a9f521b3f177748 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 13:25:23 -0800 Subject: [PATCH 10/44] minimal pyproject.toml --- glvis/__about__.py | 1 + glvis/__init__.py | 1 + pyproject.toml | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 glvis/__about__.py create mode 100644 pyproject.toml diff --git a/glvis/__about__.py b/glvis/__about__.py new file mode 100644 index 00000000..6a9beea8 --- /dev/null +++ b/glvis/__about__.py @@ -0,0 +1 @@ +__version__ = "0.4.0" diff --git a/glvis/__init__.py b/glvis/__init__.py index e69de29b..7553d9f8 100644 --- a/glvis/__init__.py +++ b/glvis/__init__.py @@ -0,0 +1 @@ +from .widget import glvis \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..c44cdbfb --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,24 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "pyglvis" +dynamic = ["version"] +description = "GLVis widget for Jupyter notebooks" +readme = "README.md" +license = { file = "LICENSE" } +dependencies = [ + "mfem>=4.5.2", + "anywidget[dev]==0.9.0" +] + +[project.urls] +homepage = "https://glvis.org" +repostiory = "https://github.com/glvis/pyglvis" + +[tool.hatch.version] +path = "glvis/__about__.py" + +[tool.hatch.build.targets.wheel] +packages = ["glvis"] From cb9fe0bbda3a142119b1d8449970cc762ef6f13d Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 13:42:22 -0800 Subject: [PATCH 11/44] fixed path for js import into widget.py --- glvis/widget.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/glvis/widget.py b/glvis/widget.py index 1e5068e8..9b57f4ab 100644 --- a/glvis/widget.py +++ b/glvis/widget.py @@ -1,10 +1,13 @@ import anywidget import io from traitlets import Unicode, Int, Bool +from pathlib import Path # Import file contents example: https://github.com/juba/pyobsplot/blob/main/src/pyobsplot/widget.py -class GLVis(anywidget.AnyWidget): - _esm = anywidget._file_contents.FileContents("widget.js", start_thread=False) +class glvis(anywidget.AnyWidget): + _esm = anywidget._file_contents.FileContents( + Path(__file__).parent / "widget.js", start_thread=False + ) data_str = Unicode('').tag(sync=True) data_type = Unicode('').tag(sync=True) From 017bf51a6805ce643bafc4e2dd54d0763e144ece Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 13:51:00 -0800 Subject: [PATCH 12/44] changing glvis->pyglvis and class glvis to class Glvis --- glvis/__init__.py | 1 - {glvis => pyglvis}/__about__.py | 0 pyglvis/__init__.py | 4 ++++ {glvis => pyglvis}/widget.js | 0 {glvis => pyglvis}/widget.py | 2 +- 5 files changed, 5 insertions(+), 2 deletions(-) delete mode 100644 glvis/__init__.py rename {glvis => pyglvis}/__about__.py (100%) create mode 100644 pyglvis/__init__.py rename {glvis => pyglvis}/widget.js (100%) rename {glvis => pyglvis}/widget.py (93%) diff --git a/glvis/__init__.py b/glvis/__init__.py deleted file mode 100644 index 7553d9f8..00000000 --- a/glvis/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .widget import glvis \ No newline at end of file diff --git a/glvis/__about__.py b/pyglvis/__about__.py similarity index 100% rename from glvis/__about__.py rename to pyglvis/__about__.py diff --git a/pyglvis/__init__.py b/pyglvis/__init__.py new file mode 100644 index 00000000..ed9cd959 --- /dev/null +++ b/pyglvis/__init__.py @@ -0,0 +1,4 @@ +from pyglvis.__about__ import __version__ +from pyglvis.widget import Glvis + +__all__ = ["Glvis", "__version__"] \ No newline at end of file diff --git a/glvis/widget.js b/pyglvis/widget.js similarity index 100% rename from glvis/widget.js rename to pyglvis/widget.js diff --git a/glvis/widget.py b/pyglvis/widget.py similarity index 93% rename from glvis/widget.py rename to pyglvis/widget.py index 9b57f4ab..2ef4b5ab 100644 --- a/glvis/widget.py +++ b/pyglvis/widget.py @@ -4,7 +4,7 @@ from pathlib import Path # Import file contents example: https://github.com/juba/pyobsplot/blob/main/src/pyobsplot/widget.py -class glvis(anywidget.AnyWidget): +class Glvis(anywidget.AnyWidget): _esm = anywidget._file_contents.FileContents( Path(__file__).parent / "widget.js", start_thread=False ) From 8309447265c9db706b27d2c5c337196cbdddd937 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 13:52:13 -0800 Subject: [PATCH 13/44] update pyproject.toml --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c44cdbfb..6f9c92ae 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,7 +18,7 @@ homepage = "https://glvis.org" repostiory = "https://github.com/glvis/pyglvis" [tool.hatch.version] -path = "glvis/__about__.py" +path = "pyglvis/__about__.py" [tool.hatch.build.targets.wheel] -packages = ["glvis"] +packages = ["pyglvis"] From 5638a35ed7ad53b9a079ccabba5df94f8e2d9d56 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 15:54:17 -0800 Subject: [PATCH 14/44] added init to python class. Also created a wrapper class so that API of Glvis object is cleaner --- pyglvis/widget.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/pyglvis/widget.py b/pyglvis/widget.py index 2ef4b5ab..870a1398 100644 --- a/pyglvis/widget.py +++ b/pyglvis/widget.py @@ -1,10 +1,41 @@ import anywidget import io from traitlets import Unicode, Int, Bool +from typing import Union, Tuple from pathlib import Path +from mfem._ser.mesh import Mesh +from mfem._ser.gridfunc import GridFunction + +Data = Union[Tuple[Mesh, GridFunction], Mesh, str] + +def data_to_str(data: Data) -> str: + if isinstance(data, str): + return data + + sio = io.StringIO() + if isinstance(data, tuple): + sio.write("solution\n") + data[0].WriteToStream(sio) + data[1].WriteToStream(sio) + elif isinstance(data, Mesh): + sio.write("mesh\n") + data.WriteToStream(sio) + else: + raise TypeError("Unknown data type") + return sio.getvalue() + + +def to_stream(mesh: Mesh, gf: GridFunction = None) -> str: + sio = io.StringIO() + sio.write("solution\n" if gf is not None else "mesh\n") + mesh.WriteToStream(sio) + if gf: + gf.WriteToStream(sio) + return sio.getvalue() + # Import file contents example: https://github.com/juba/pyobsplot/blob/main/src/pyobsplot/widget.py -class Glvis(anywidget.AnyWidget): +class GlvisWidget(anywidget.AnyWidget): _esm = anywidget._file_contents.FileContents( Path(__file__).parent / "widget.js", start_thread=False ) @@ -15,3 +46,23 @@ class Glvis(anywidget.AnyWidget): height = Int(480).tag(sync=True) is_new_stream = Bool().tag(sync=True) + +# The purpose of this wrapper class is to keep the API of Glvis clean by excluding inherited properties/methods +class Glvis: + widget = GlvisWidget() + + # Automatically renders the widget - necessary because this is a wrapper class + def _repr_mimebundle_(self, *args, **kwargs): + return self.widget._repr_mimebundle_(*args, **kwargs) + + def __init__(self, data: Data, width: int = 640, height: int = 480): + self.set_size(width, height) + self._sync(data, is_new=True) + + def set_size(self, width: int, height: int): + self.widget.width = width + self.widget.height = height + + def _sync(self, data: Data, is_new: bool = True): + self.widget.is_new_stream = is_new + self.widget.data_str = data_to_str(data) \ No newline at end of file From 44accd0490026a132964e1d23c357601e90a0f16 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 15:54:48 -0800 Subject: [PATCH 15/44] Updating pyproject.toml. Wrapper class uses _repr_mimebundle_ property which requires ipywidgets>=8.0.0 --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 6f9c92ae..70064e9a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,8 @@ readme = "README.md" license = { file = "LICENSE" } dependencies = [ "mfem>=4.5.2", - "anywidget[dev]==0.9.0" + "anywidget[dev]==0.9.0", + "ipywidgets>=8.0.0" # required for _repr_mimebundle_ ] [project.urls] From 0b17fd5cec5f6851486535c97926b88a940064fe Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 15:56:09 -0800 Subject: [PATCH 16/44] removing data_type as it is no longer used in display() and update() from glvis-js --- pyglvis/widget.js | 1 - pyglvis/widget.py | 1 - 2 files changed, 2 deletions(-) diff --git a/pyglvis/widget.js b/pyglvis/widget.js index 611c9795..d47d021a 100644 --- a/pyglvis/widget.js +++ b/pyglvis/widget.js @@ -16,7 +16,6 @@ function render({ model, el }) { } function plot() { - const type = model.get("data_type"); const data = model.get("data_str"); const is_new_stream = model.get("is_new_stream"); if (is_new_stream) { diff --git a/pyglvis/widget.py b/pyglvis/widget.py index 870a1398..92d610d0 100644 --- a/pyglvis/widget.py +++ b/pyglvis/widget.py @@ -41,7 +41,6 @@ class GlvisWidget(anywidget.AnyWidget): ) data_str = Unicode('').tag(sync=True) - data_type = Unicode('').tag(sync=True) width = Int(640).tag(sync=True) height = Int(480).tag(sync=True) is_new_stream = Bool().tag(sync=True) From dcb3af9afc1ce75c2a9699158756d683f62c0678 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 16:04:56 -0800 Subject: [PATCH 17/44] cleanup --- pyglvis/widget.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/pyglvis/widget.py b/pyglvis/widget.py index 92d610d0..3d8b9311 100644 --- a/pyglvis/widget.py +++ b/pyglvis/widget.py @@ -25,15 +25,6 @@ def data_to_str(data: Data) -> str: raise TypeError("Unknown data type") return sio.getvalue() - -def to_stream(mesh: Mesh, gf: GridFunction = None) -> str: - sio = io.StringIO() - sio.write("solution\n" if gf is not None else "mesh\n") - mesh.WriteToStream(sio) - if gf: - gf.WriteToStream(sio) - return sio.getvalue() - # Import file contents example: https://github.com/juba/pyobsplot/blob/main/src/pyobsplot/widget.py class GlvisWidget(anywidget.AnyWidget): _esm = anywidget._file_contents.FileContents( From e763390bbbae125dd25d2ce63796bc7d387543c8 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 16:15:28 -0800 Subject: [PATCH 18/44] moved Glvis.widget to __init__ and made it a private property so that multiple objects can exist independently --- pyglvis/widget.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/pyglvis/widget.py b/pyglvis/widget.py index 3d8b9311..c4c2e1f2 100644 --- a/pyglvis/widget.py +++ b/pyglvis/widget.py @@ -39,20 +39,25 @@ class GlvisWidget(anywidget.AnyWidget): # The purpose of this wrapper class is to keep the API of Glvis clean by excluding inherited properties/methods class Glvis: - widget = GlvisWidget() - - # Automatically renders the widget - necessary because this is a wrapper class - def _repr_mimebundle_(self, *args, **kwargs): - return self.widget._repr_mimebundle_(*args, **kwargs) - def __init__(self, data: Data, width: int = 640, height: int = 480): + self._widget = GlvisWidget() self.set_size(width, height) self._sync(data, is_new=True) + # Automatically renders the widget - necessary because this is a wrapper class + def _repr_mimebundle_(self, *args, **kwargs): + return self._widget._repr_mimebundle_(*args, **kwargs) + def set_size(self, width: int, height: int): - self.widget.width = width - self.widget.height = height + self._widget.width = width + self._widget.height = height + + # def plot(self, data: Data): + # self._sync(data, is_new=True) + + # def update(self, data: Data): + # self._sync(data, is_new=False) def _sync(self, data: Data, is_new: bool = True): - self.widget.is_new_stream = is_new - self.widget.data_str = data_to_str(data) \ No newline at end of file + self._widget.is_new_stream = is_new + self._widget.data_str = data_to_str(data) \ No newline at end of file From 992201e3c1c36b10abbd98aeea110c041c342cbc Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 16:18:48 -0800 Subject: [PATCH 19/44] adding in plot() and update() --- pyglvis/widget.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyglvis/widget.py b/pyglvis/widget.py index c4c2e1f2..dc7a75a8 100644 --- a/pyglvis/widget.py +++ b/pyglvis/widget.py @@ -52,11 +52,11 @@ def set_size(self, width: int, height: int): self._widget.width = width self._widget.height = height - # def plot(self, data: Data): - # self._sync(data, is_new=True) + def plot(self, data: Data): + self._sync(data, is_new=True) - # def update(self, data: Data): - # self._sync(data, is_new=False) + def update(self, data: Data): + self._sync(data, is_new=False) def _sync(self, data: Data, is_new: bool = True): self._widget.is_new_stream = is_new From 68382692da61c795fd850c384ffc3b5620182452 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Fri, 9 Feb 2024 16:54:00 -0800 Subject: [PATCH 20/44] on_msg --- pyglvis/widget.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pyglvis/widget.py b/pyglvis/widget.py index dc7a75a8..8dbf8973 100644 --- a/pyglvis/widget.py +++ b/pyglvis/widget.py @@ -3,6 +3,7 @@ from traitlets import Unicode, Int, Bool from typing import Union, Tuple from pathlib import Path +import base64 from mfem._ser.mesh import Mesh from mfem._ser.gridfunc import GridFunction @@ -58,6 +59,16 @@ def plot(self, data: Data): def update(self, data: Data): self._sync(data, is_new=False) + def _on_msg(self, _, content, buffers): + if content.get("type", "") == "screenshot": + data = content.get("b64", "") + name = content.get("name", "glvis.png") + if not data: + print(f"unable to save {name}, bad data") + return + with open(name, "wb") as f: + f.write(base64.decodebytes(data.encode('ascii'))) + def _sync(self, data: Data, is_new: bool = True): self._widget.is_new_stream = is_new self._widget.data_str = data_to_str(data) \ No newline at end of file From 921f38daec982442eec26982be2111a1e102e348 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Mon, 4 Mar 2024 16:32:57 -0800 Subject: [PATCH 21/44] 'keys' kwarg in widget --- examples/ex1.ipynb | 24 +++++++++++++++--------- pyglvis/__about__.py | 2 +- pyglvis/__init__.py | 4 ++-- pyglvis/widget.js | 2 +- pyglvis/widget.py | 21 ++++++++++++--------- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/examples/ex1.ipynb b/examples/ex1.ipynb index 81e0ff62..232554e4 100644 --- a/examples/ex1.ipynb +++ b/examples/ex1.ipynb @@ -2,7 +2,9 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "tags": [] + }, "source": [ "## MFEM Example 1\n", "\n", @@ -39,12 +41,14 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# Requires PyMFEM, see https://github.com/mfem/PyMFEM\n", "import mfem.ser as mfem\n", - "from glvis import glvis, to_stream" + "from pyglvis import glvis" ] }, { @@ -107,11 +111,14 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# Plot the mesh + solution (all GLVis keys and mouse commands work)\n", - "glvis((mesh, x), 400, 400)" + "g=glvis((mesh, x))\n", + "g" ] }, { @@ -131,15 +138,14 @@ "outputs": [], "source": [ "# Visualization with additional GLVis keys\n", - "g = glvis(to_stream(mesh,x) + 'keys ARjlmcbp*******')\n", - "g.set_size(600, 400)\n", + "g = glvis((mesh,x), keys='ARjlmcbp*******')\n", "g" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -153,7 +159,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.1" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/pyglvis/__about__.py b/pyglvis/__about__.py index 6a9beea8..3d26edf7 100644 --- a/pyglvis/__about__.py +++ b/pyglvis/__about__.py @@ -1 +1 @@ -__version__ = "0.4.0" +__version__ = "0.4.1" diff --git a/pyglvis/__init__.py b/pyglvis/__init__.py index ed9cd959..4b3c8f32 100644 --- a/pyglvis/__init__.py +++ b/pyglvis/__init__.py @@ -1,4 +1,4 @@ from pyglvis.__about__ import __version__ -from pyglvis.widget import Glvis +from pyglvis.widget import glvis -__all__ = ["Glvis", "__version__"] \ No newline at end of file +__all__ = ["glvis", "GlvisWidget", "__version__"] \ No newline at end of file diff --git a/pyglvis/widget.js b/pyglvis/widget.js index d47d021a..9bdaec99 100644 --- a/pyglvis/widget.js +++ b/pyglvis/widget.js @@ -45,4 +45,4 @@ function render({ model, el }) { plot(); } -export default { render }; \ No newline at end of file +export default { render }; diff --git a/pyglvis/widget.py b/pyglvis/widget.py index 8dbf8973..0e469d1a 100644 --- a/pyglvis/widget.py +++ b/pyglvis/widget.py @@ -39,11 +39,11 @@ class GlvisWidget(anywidget.AnyWidget): # The purpose of this wrapper class is to keep the API of Glvis clean by excluding inherited properties/methods -class Glvis: - def __init__(self, data: Data, width: int = 640, height: int = 480): +class glvis: + def __init__(self, data: Data, width: int = 640, height: int = 480, keys=None): self._widget = GlvisWidget() self.set_size(width, height) - self._sync(data, is_new=True) + self._sync(data, is_new=True, keys=keys) # Automatically renders the widget - necessary because this is a wrapper class def _repr_mimebundle_(self, *args, **kwargs): @@ -53,11 +53,11 @@ def set_size(self, width: int, height: int): self._widget.width = width self._widget.height = height - def plot(self, data: Data): - self._sync(data, is_new=True) + def plot(self, data: Data, keys=None): + self._sync(data, is_new=True, keys=keys) - def update(self, data: Data): - self._sync(data, is_new=False) + def update(self, data: Data, keys=None): + self._sync(data, is_new=False, keys=keys) def _on_msg(self, _, content, buffers): if content.get("type", "") == "screenshot": @@ -69,6 +69,9 @@ def _on_msg(self, _, content, buffers): with open(name, "wb") as f: f.write(base64.decodebytes(data.encode('ascii'))) - def _sync(self, data: Data, is_new: bool = True): + def _sync(self, data: Data, is_new: bool = True, keys=None): self._widget.is_new_stream = is_new - self._widget.data_str = data_to_str(data) \ No newline at end of file + data_string = data_to_str(data) + if keys is not None: + data_string += f"keys {keys}" + self._widget.data_str = data_string \ No newline at end of file From c9140e302861a975e52014284b02396905e6a86e Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Mon, 4 Mar 2024 16:44:55 -0800 Subject: [PATCH 22/44] removing unnecessary postBuild commands for binder --- .binder/postBuild | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.binder/postBuild b/.binder/postBuild index 6e2b58dc..4359494c 100644 --- a/.binder/postBuild +++ b/.binder/postBuild @@ -1,6 +1,2 @@ # install this pip install . - -# install jupyter-lab extension -jupyter labextension install @jupyter-widgets/jupyterlab-manager --no-build -jupyter labextension install glvis-jupyter From bf0bd6372c58f2f3964683409e5196aab9cdd331 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Mon, 4 Mar 2024 17:05:43 -0800 Subject: [PATCH 23/44] return module name from pyglvis -> glvis --- {pyglvis => glvis}/__about__.py | 0 {pyglvis => glvis}/__init__.py | 0 {pyglvis => glvis}/widget.js | 0 {pyglvis => glvis}/widget.py | 0 pyproject.toml | 4 ++-- 5 files changed, 2 insertions(+), 2 deletions(-) rename {pyglvis => glvis}/__about__.py (100%) rename {pyglvis => glvis}/__init__.py (100%) rename {pyglvis => glvis}/widget.js (100%) rename {pyglvis => glvis}/widget.py (100%) diff --git a/pyglvis/__about__.py b/glvis/__about__.py similarity index 100% rename from pyglvis/__about__.py rename to glvis/__about__.py diff --git a/pyglvis/__init__.py b/glvis/__init__.py similarity index 100% rename from pyglvis/__init__.py rename to glvis/__init__.py diff --git a/pyglvis/widget.js b/glvis/widget.js similarity index 100% rename from pyglvis/widget.js rename to glvis/widget.js diff --git a/pyglvis/widget.py b/glvis/widget.py similarity index 100% rename from pyglvis/widget.py rename to glvis/widget.py diff --git a/pyproject.toml b/pyproject.toml index 70064e9a..c7479bea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ homepage = "https://glvis.org" repostiory = "https://github.com/glvis/pyglvis" [tool.hatch.version] -path = "pyglvis/__about__.py" +path = "glvis/__about__.py" [tool.hatch.build.targets.wheel] -packages = ["pyglvis"] +packages = ["glvis"] From 9e62a2a79d2354c3416a97a869f21583087e2e54 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Mon, 4 Mar 2024 17:07:51 -0800 Subject: [PATCH 24/44] update module import names --- examples/ex1.ipynb | 2 +- glvis/__init__.py | 6 +++--- glvis/widget.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/ex1.ipynb b/examples/ex1.ipynb index 232554e4..7277e0d4 100644 --- a/examples/ex1.ipynb +++ b/examples/ex1.ipynb @@ -48,7 +48,7 @@ "source": [ "# Requires PyMFEM, see https://github.com/mfem/PyMFEM\n", "import mfem.ser as mfem\n", - "from pyglvis import glvis" + "from glvis import glvis" ] }, { diff --git a/glvis/__init__.py b/glvis/__init__.py index 4b3c8f32..4daa0bbe 100644 --- a/glvis/__init__.py +++ b/glvis/__init__.py @@ -1,4 +1,4 @@ -from pyglvis.__about__ import __version__ -from pyglvis.widget import glvis +from glvis.__about__ import __version__ +from glvis.widget import glvis -__all__ = ["glvis", "GlvisWidget", "__version__"] \ No newline at end of file +__all__ = ["glvis", "GlvisWidget", "__version__"] diff --git a/glvis/widget.py b/glvis/widget.py index 0e469d1a..274025ed 100644 --- a/glvis/widget.py +++ b/glvis/widget.py @@ -74,4 +74,4 @@ def _sync(self, data: Data, is_new: bool = True, keys=None): data_string = data_to_str(data) if keys is not None: data_string += f"keys {keys}" - self._widget.data_str = data_string \ No newline at end of file + self._widget.data_str = data_string From ea7365d8ffe95624a492973d7d720aacdf43537b Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Mon, 4 Mar 2024 17:24:32 -0800 Subject: [PATCH 25/44] update examples to work with new class --- examples/ex9.ipynb | 11 +++++++++-- examples/plot.ipynb | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/examples/ex9.ipynb b/examples/ex9.ipynb index 1f50df6c..96b5659b 100644 --- a/examples/ex9.ipynb +++ b/examples/ex9.ipynb @@ -264,8 +264,15 @@ "outputs": [], "source": [ "g = glvis((mesh, u))\n", - "g.render()\n", - "\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "class FE_Evolution(mfem.PyTimeDependentOperator):\n", " def __init__(self, M, K, b):\n", " mfem.PyTimeDependentOperator.__init__(self, M.Size())\n", diff --git a/examples/plot.ipynb b/examples/plot.ipynb index bd8ad95d..9c1f1a9e 100644 --- a/examples/plot.ipynb +++ b/examples/plot.ipynb @@ -179,7 +179,7 @@ "\n", "# Build widget\n", "widgets.HBox([\n", - " g,\n", + " g._widget,\n", " widgets.VBox([nx, ny, nz, \n", " element_type, \n", " mesh_order, \n", From b1fe9a2dc8f87897df8fe7d3035af984ca87ee9a Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Mon, 4 Mar 2024 17:31:02 -0800 Subject: [PATCH 26/44] add glvis.render() --- examples/ex9.ipynb | 47 +++++++++++++++++++++++++++------------------- glvis/widget.py | 4 ++++ 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/examples/ex9.ipynb b/examples/ex9.ipynb index 96b5659b..8e2dc3ec 100644 --- a/examples/ex9.ipynb +++ b/examples/ex9.ipynb @@ -31,7 +31,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "from __future__ import print_function\n", @@ -48,7 +50,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# 1. Setup problem parameters\n", @@ -89,7 +93,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# 2. Download the mesh from GitHub and read it. \n", @@ -106,7 +112,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# 3. Define the ODE solver used for time integration. \n", @@ -124,7 +132,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# 4. Refine the mesh to increase the resolution. In this example we do\n", @@ -141,7 +151,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# 5. Define the discontinuous DG finite element space of the given\n", @@ -218,7 +230,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "# 6. Set up and assemble the bilinear and linear forms corresponding to \n", @@ -260,19 +274,14 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "g = glvis((mesh, u))\n", - "g" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ + "g.render()\n", + "\n", "class FE_Evolution(mfem.PyTimeDependentOperator):\n", " def __init__(self, M, K, b):\n", " mfem.PyTimeDependentOperator.__init__(self, M.Size())\n", @@ -314,7 +323,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -328,7 +337,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/glvis/widget.py b/glvis/widget.py index 274025ed..6f4beef7 100644 --- a/glvis/widget.py +++ b/glvis/widget.py @@ -1,5 +1,6 @@ import anywidget import io +from IPython.display import display as ipydisplay from traitlets import Unicode, Int, Bool from typing import Union, Tuple from pathlib import Path @@ -75,3 +76,6 @@ def _sync(self, data: Data, is_new: bool = True, keys=None): if keys is not None: data_string += f"keys {keys}" self._widget.data_str = data_string + + def render(self): + ipydisplay(self) From bf2e5db47758027d7fc968506183feccad9fd7b8 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Mon, 4 Mar 2024 17:32:10 -0800 Subject: [PATCH 27/44] update readme, badges (anywidget branch) and api calls --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5d77a7be..bc63f737 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Interactive GLVis Jupyter Widget -[![badge](examples/basic.svg "Basic GLVis + Jupyter Example")](https://mybinder.org/v2/gh/GLVis/pyglvis/HEAD?filepath=examples%2Fbasic.ipynb) -[![badge](examples/plot.svg "Plot grid functions")](https://mybinder.org/v2/gh/GLVis/pyglvis/HEAD?filepath=examples%2Fplot.ipynb) -[![badge](examples/ex1.svg "MFEM's Example 1")](https://mybinder.org/v2/gh/GLVis/pyglvis/HEAD?filepath=examples%2Fex1.ipynb) -[![badge](examples/ex9.svg "MFEM's Example 9")](https://mybinder.org/v2/gh/GLVis/pyglvis/HEAD?filepath=examples%2Fex9.ipynb) +[![badge](examples/basic.svg "Basic GLVis + Jupyter Example")](https://mybinder.org/v2/gh/GLVis/pyglvis/anywidget?filepath=examples%2Fbasic.ipynb) +[![badge](examples/plot.svg "Plot grid functions")](https://mybinder.org/v2/gh/GLVis/pyglvis/anywidget?filepath=examples%2Fplot.ipynb) +[![badge](examples/ex1.svg "MFEM's Example 1")](https://mybinder.org/v2/gh/GLVis/pyglvis/anywidget?filepath=examples%2Fex1.ipynb) +[![badge](examples/ex9.svg "MFEM's Example 9")](https://mybinder.org/v2/gh/GLVis/pyglvis/anywidget?filepath=examples%2Fex9.ipynb) This repository contains a [Jupyter](https://jupyter.org/) widget for the [GLVis](https://glvis.org/) finite element visualization tool based on the [glvis-js](https://github.com/GLVis/glvis-js) JavaScript/WebAssembly library. @@ -14,7 +14,7 @@ visualization tool based on the [glvis-js](https://github.com/GLVis/glvis-js) Ja ```python from glvis import glvis -glvis(data[, width=640, height=480]) +glvis(data, [width=640, height=480, keys=None]) # or assign if you want to update later g = glvis(data) @@ -22,7 +22,7 @@ g = glvis(data) g ``` -The `data` object and be one of: +The `data` object can be one of: - a `str`, in the format of `*.saved` files - a `Mesh`, defined in [PyMFEM](https://github.com/mfem/pymfem) From c885a0999dbbebf245ead3d9c2a1edb26fffdfd5 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Mon, 4 Mar 2024 17:47:14 -0800 Subject: [PATCH 28/44] removing a lot from README since many installation/development phases are now obsolete (e.g. glvis-jupyter on npm) --- README.md | 125 ++++-------------------------------------------------- 1 file changed, 8 insertions(+), 117 deletions(-) diff --git a/README.md b/README.md index bc63f737..5ac3db90 100644 --- a/README.md +++ b/README.md @@ -57,141 +57,32 @@ jupyter notebook The GLVis Jupyter widget can be simply installed with `pip`: ``` -pip install glvis +pip install pyglvis ``` -It order for the installation to be useful you must enable the extension for one or both -of the [Classic Notebook](https://jupyter-notebook.readthedocs.io/en/stable/) and -[Jupyter Lab](https://jupyterlab.readthedocs.io/en/stable/), see the next two sections: - -### Jupyter Notebook - -To use the widget with the basic Notebook enable it with `jupyter nbextension enable`: - -``` -jupyter nbextension enable --py glvis -``` - -After enabling the extension you can verify you're good to go with: - -``` -jupyter nbextension list -``` - -The output should be something like: - -``` -Known nbextensions: - config dir: path/to/nbconfig - notebook section - glvis-jupyter/extension enabled - - Validating: OK - - jupyter-js-widgets/extension enabled - - Validating: OK -``` - -If `glvis-jupyter` and `jupyter-js-widgets` are not both listed, try the following: - -``` -jupyter nbextension install --user --py glvis -jupyter nbextension enable --user --py glvis -jupyter nbextension install --user --py widgetsnbextension -jupyter nbextension enable --user --py widgetsnbextension -``` -You may also need to run these if you have upgraded to a newer version of the GLVis Jupyter widget. - -### Jupyter Lab - -[JupyterLab](https://jupyterlab.readthedocs.io) requires another set of install commands: - -``` -jupyter labextension install @jupyter-widgets/jupyterlab-manager --no-build -jupyter labextension install glvis-jupyter -``` ## Development -Development installation requires `npm`. - -If you want to test a new version of `glvis`: - -1. Bump the version in _pyglvis/js/package.json_ and _glvis-js/package.json_ -2. `npm install path/to/glvis-js` +`pyglvis` pulls the latest version of `glvis-js` from `npm` in the first line of `/glvis/widget.js`: +`import glvis from "https://esm.sh/glvis";` +If you want to use a specific version, simply add `@x.y.z` to the end of the import statement, where `x.y.z` matches a version number available on `npm`, e.g. +`import glvis from "https://esm.sh/glvis@0.6.3";` -Each time you update stuff in _pyglvis/js/src_: -1. `npm install` -2. `npx webpack` - - -Once: - -``` -git clone https://github.com/glvis/pyglvis.git -cd pyglvis -pip install -e . -``` - -### Developing in Jupyter Notebook - -``` -jupyter nbextension install --py --symlink --sys-prefix glvis -jupyter nbextension enable --py --sys-prefix glvis -``` - -### Developing in Jupyter Lab - -```bash -jupyter labextension install @jupyter-widgets/jupyterlab-manager --no-build -# I believe you need node in the path Lab uses for this to work, I see an extension load error -# in a context where I don't have it: -# Failed to load resource: the server responded with a status of 500 (Internal Server Error) -# lab/api/extensions?1610138347763 -# Which is just a python stacktrace, ending with: -# raise ValueError(msg) -# ValueError: Please install Node.js and npm before continuing installation. -jupyter labextension link ./js -``` - - -### Troubleshooting - -If you run into errors related to node/npm that aren't helpful try: - -```bash -cd pyglvis -make clean -cd js -# fix errors in these steps, run `make -C .. clean` each time -npm install -npx webpack -``` ## Releasing -### Releasing a new version of glvis-jupyter on NPM: +### Releasing a new version of glvis on NPM: -- Update the required version of `glvis` in `js/package.json` +To publish a new version of `glvis-js`, follow the instructions on the `glvis-js`. -- Update the version in `js/package.json` - -```bash -# clean out the `dist` and `node_modules` directories -git clean -fdx -npm install -npm publish -``` ### Releasing a new version of glvis on PyPI: -- Update `glvis/_version.py` - - Set release version - - Update `extension_version` to match `js/package.json` +- Update `__version__` in `glvis/__about__.py` - `git add` and `git commit` changes - - `glvis/_version.py`, `js/package.json`, and `js/package-lock.js` You will need [twine](https://pypi.org/project/twine/) to publish to PyPI, install with `pip`. From 690369c50181cef6bd8d74519b4b057ec3bcb55e Mon Sep 17 00:00:00 2001 From: justinlaughlin Date: Tue, 18 Jun 2024 16:48:14 -0700 Subject: [PATCH 29/44] change readme to recommend using simpler pip install for mfem --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5ac3db90..072fd7da 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ The `data` object can be one of: - a `Mesh`, defined in [PyMFEM](https://github.com/mfem/pymfem) - a `(Mesh, GridFunction)` tuple, defined in [PyMFEM](https://github.com/mfem/pymfem) -[PyMFEM](https://github.com/mfem/pymfem) can be installed with `pip install mfem --no-binary mfem`. +[PyMFEM](https://github.com/mfem/pymfem) can be installed with `pip install mfem`. Once you have a `glvis` object there are a few methods that can used to update the From 181d77220f0d6e519c103405074a340bdb8a5fcc Mon Sep 17 00:00:00 2001 From: justinlaughlin Date: Wed, 19 Jun 2024 18:25:46 -0700 Subject: [PATCH 30/44] remove unnecessary white space --- glvis/widget.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/glvis/widget.js b/glvis/widget.js index 9bdaec99..e9f58a4b 100644 --- a/glvis/widget.js +++ b/glvis/widget.js @@ -1,14 +1,14 @@ // _esm = """ import glvis from "https://esm.sh/glvis"; - + function render({ model, el }) { let div = document.createElement("div"); div.setAttribute("id", glvis.rand_id()); div.setAttribute("tabindex", "0"); el.append(div); - + let width = () => model.get("width"); - let height = () => model.get("height"); + let height = () => model.get("height"); let glv = new glvis.State(div, width(), height()); function set_size() { From 8436ec3139f69785a839cd0f9f36860edd6d2f5b Mon Sep 17 00:00:00 2001 From: justinlaughlin Date: Wed, 19 Jun 2024 18:26:25 -0700 Subject: [PATCH 31/44] fix keys (should just append keys directly to string) --- glvis/widget.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glvis/widget.py b/glvis/widget.py index 6f4beef7..8dcef109 100644 --- a/glvis/widget.py +++ b/glvis/widget.py @@ -74,7 +74,7 @@ def _sync(self, data: Data, is_new: bool = True, keys=None): self._widget.is_new_stream = is_new data_string = data_to_str(data) if keys is not None: - data_string += f"keys {keys}" + data_string += f"{keys}" self._widget.data_str = data_string def render(self): From 15b089b99f961cf2477cccb965dd25f67622c1fd Mon Sep 17 00:00:00 2001 From: justinlaughlin Date: Wed, 19 Jun 2024 18:48:28 -0700 Subject: [PATCH 32/44] remove more whitespace --- glvis/widget.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/glvis/widget.py b/glvis/widget.py index 8dcef109..2b3e875a 100644 --- a/glvis/widget.py +++ b/glvis/widget.py @@ -39,7 +39,7 @@ class GlvisWidget(anywidget.AnyWidget): is_new_stream = Bool().tag(sync=True) -# The purpose of this wrapper class is to keep the API of Glvis clean by excluding inherited properties/methods +# The purpose of this wrapper class is to keep the API of Glvis clean by excluding inherited properties/methods class glvis: def __init__(self, data: Data, width: int = 640, height: int = 480, keys=None): self._widget = GlvisWidget() @@ -76,6 +76,6 @@ def _sync(self, data: Data, is_new: bool = True, keys=None): if keys is not None: data_string += f"{keys}" self._widget.data_str = data_string - + def render(self): ipydisplay(self) From d4f549ba3a57de72a54241da96406c7441b1b47f Mon Sep 17 00:00:00 2001 From: justinlaughlin Date: Wed, 19 Jun 2024 20:03:28 -0700 Subject: [PATCH 33/44] lots of changes and cleanup in README.md file --- README.md | 140 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 106 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 072fd7da..7842e6f2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Interactive GLVis Jupyter Widget +# PyGLVis [![badge](examples/basic.svg "Basic GLVis + Jupyter Example")](https://mybinder.org/v2/gh/GLVis/pyglvis/anywidget?filepath=examples%2Fbasic.ipynb) @@ -6,81 +6,145 @@ [![badge](examples/ex1.svg "MFEM's Example 1")](https://mybinder.org/v2/gh/GLVis/pyglvis/anywidget?filepath=examples%2Fex1.ipynb) [![badge](examples/ex9.svg "MFEM's Example 9")](https://mybinder.org/v2/gh/GLVis/pyglvis/anywidget?filepath=examples%2Fex9.ipynb) -This repository contains a [Jupyter](https://jupyter.org/) widget for the [GLVis](https://glvis.org/) finite element -visualization tool based on the [glvis-js](https://github.com/GLVis/glvis-js) JavaScript/WebAssembly library. +PyGLVis is an interactive [Jupyter](https://jupyter.org/) widget for visualizing finite element meshes and functions, built on-top of the [GLVis](https://glvis.org/) library. -## Usage +## 📦 Installation + +The GLVis Jupyter widget is installed using `pip`. To install the latest version from the repository: + +```bash +git clone https://github.com/GLVis/pyglvis.git +cd pyglvis +pip install . +``` + +Or, install directly from PyPi, +```bash +pip install glvis +``` + +PyGLVis requires the Python wrapper for MFEM, [PyMFEM](https://github.com/mfem/pymfem), which can be installed with +```bash +pip install mfem +``` + + + +## 🚀 Usage + +### Basic usage ```python from glvis import glvis -glvis(data, [width=640, height=480, keys=None]) +# Create a `glvis` object +g = glvis(data, width=640, height=480) -# or assign if you want to update later -g = glvis(data) -# run a cell with `g` to show it +# Run a cell with `g` as the last statement to display the widget g ``` The `data` object can be one of: -- a `str`, in the format of `*.saved` files -- a `Mesh`, defined in [PyMFEM](https://github.com/mfem/pymfem) -- a `(Mesh, GridFunction)` tuple, defined in [PyMFEM](https://github.com/mfem/pymfem) +- `Mesh`, defined in [PyMFEM](https://github.com/mfem/pymfem) +- `(Mesh, GridFunction)` tuple, defined in [PyMFEM](https://github.com/mfem/pymfem) +- `str`, in the format of `*.saved` files [used by MFEM and GLVis](https://mfem.org/mesh-format-v1.0/). See [examples/basic.ipynb](examples/basic.ipynb) for an example. + +### Customization with key commands + +GLVis has many keyboard commands that can be used to customize the visualization. +A few of the most common are listed below. See the [GLVis README](https://github.com/GLVis/glvis?tab=readme-ov-file#key-commands) for a full list. + - `r` - reset the view + - `c` - toggle the colorbar + - `j` - toggle perspective + - `l` - toggle the light + - `g` - toggle the background color (white/black) + - `a` - cycle through bounding box axes states + - `m` - cycle through mesh states + - `p` - cycle through color palettes + - `t` - cycle through materials and lights + - `0` - begin rotating around z-axis + - `.` - pause rotation + - `*`/`/` - zoom in/out + +These can be set using the `keys` argument when creating a `glvis` object. +```python +glvis(data, keys='rljgac//0') +``` +This combination of keys would: `r` reset the view, `l` toggle the light, `j` toggle perspective, `g` toggle the background color to black (default is white), `a` show the bounding box, `c` show the colorbar, `//` zoom out twice, and `0` begin rotating around the z-axis: + +[INSERT GIF HERE] -[PyMFEM](https://github.com/mfem/pymfem) can be installed with `pip install mfem`. +Alternatively, keys can be typed directly into the widget after it has been created: +[INSERT GIF HERE] + +### Other methods Once you have a `glvis` object there are a few methods that can used to update the -visualization: +visualization, besides using keys: ```python -# show a new Mesh/GridFunction, resets keys +# Show a new Mesh/GridFunction, resets keys g.plot(data) -# show an updated visualization with the same `Mesh` and `GridFunction` -# dimensions, preserves keys +# Show an updated visualization with the same data, preserving keys g.update(data) -# change the image size +# Change the image size g.set_size(width, height) -# force the widget to render. if the widget isn't the last statement in a cell it -# will not be shown without this. see ex9.ipynb +# Force the widget to render. If the widget isn't the last statement in a cell it +# will not be shown without this. See ex9.ipynb g.render() ``` -See the [examples](examples/) directory for additional examples. To test those locally, start a Jupyter notebook server with +See the [examples](examples/) directory for additional examples. To test those locally, start a Jupyter lab server with ``` -jupyter notebook +jupyter lab ``` -## Installation +## 🐛 Troubleshooting -The GLVis Jupyter widget can be simply installed with `pip`: +This widget was originally developed using the [jupyter widget cookiecutter](https://github.com/jupyter-widgets/widget-cookiecutter); however, [recent changes to the Jupyter ecosystem](https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html#why-a-new-version) have broken a lot of functionality, leading to a rewrite using [anywidget](https://anywidget.dev/). If you encounter any problems, please consider supporting development by opening an [issue](https://github.com/GLVis/pyglvis/issues). -``` -pip install pyglvis -``` -## Development +## 🤖 Development -`pyglvis` pulls the latest version of `glvis-js` from `npm` in the first line of `/glvis/widget.js`: -`import glvis from "https://esm.sh/glvis";` +### PyGLVis dependencies -If you want to use a specific version, simply add `@x.y.z` to the end of the import statement, where `x.y.z` matches a version number available on `npm`, e.g. -`import glvis from "https://esm.sh/glvis@0.6.3";` +```mermaid +graph TD; + A[mfem] --> B[pymfem]; + A --> C[glvis]; + C --> D[glvis-js]; + Ext1[emscripten] --> D; + D-.-E["glvis-js\n(npm/esm mirror)"] + B & E --> G[pyglvis]; + Ext2[jupyter] --> G; +``` +`pyglvis` is most directly depednent on `PyMFEM` and `glvis-js`. [PyMFEM](https://github.com/mfem/pymfem) is a Python wrapper of the finite element library, `MFEM`, while `glvis-js` is a JavaScript/WebAssembly port of `glvis`. +`glvis-js` is hosted on [github](https://github.com/glvis/glvis-js) and mirrored on [npm](https://www.npmjs.com/package/glvis). [esm.sh](https://esm.sh/glvis) allows `pyglvis` to pull the latest version of `glvis-js` directly from npm. This can be seen in the first line of [glvis/widget.js](glvis/widget.js): + +``` +import glvis from "https://esm.sh/glvis"; +``` + +You can specify a different version of `glvis-js` by adding `@x.y.z` to the end of this import statement, where `x.y.z` matches a version number available on `npm`, e.g. + +``` +import glvis from "https://esm.sh/glvis@0.6.3"; +``` -## Releasing ### Releasing a new version of glvis on NPM: -To publish a new version of `glvis-js`, follow the instructions on the `glvis-js`. +To publish a new version of `glvis-js`, follow the instructions on the [repo](https://github.com/GLVis/glvis-js/tree/master). ### Releasing a new version of glvis on PyPI: -- Update `__version__` in `glvis/__about__.py` +- Update `__version__` in `glvis/__about__.py` - `git add` and `git commit` changes @@ -93,3 +157,11 @@ twine upload dist/* git tag -a X.X.X -m 'comment' git push --tags ``` + + +## 🌐 Links +- MFEM ([website](https://mfem.org/), [github](https://github.com/mfem/mfem)) +- PyMFEM ([github](https://github.com/mfem/pymfem), [pypi](https://pypi.org/project/mfem/)) +- GLVis ([website](https://glvis.org/), [github](https://github.com/glvis/glvis)) +- glvis-js ([github](https://github.com/glvis/glvis-js), [npm](https://www.npmjs.com/package/glvis), [esm](https://esm.sh/glvis)) +- pyglvis ([github](https://github.com/GLVis/pyglvis), [pypi]()) \ No newline at end of file From d890810851713f2477f53e185e46be4694616c84 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Wed, 19 Jun 2024 20:06:08 -0700 Subject: [PATCH 34/44] Add demo gifs to README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7842e6f2..2478f001 100644 --- a/README.md +++ b/README.md @@ -73,11 +73,11 @@ glvis(data, keys='rljgac//0') ``` This combination of keys would: `r` reset the view, `l` toggle the light, `j` toggle perspective, `g` toggle the background color to black (default is white), `a` show the bounding box, `c` show the colorbar, `//` zoom out twice, and `0` begin rotating around the z-axis: -[INSERT GIF HERE] +![pyglvis_preset_keys](https://github.com/GLVis/pyglvis/assets/27717785/de0e0a99-72ac-4a88-8369-708515600b09) Alternatively, keys can be typed directly into the widget after it has been created: -[INSERT GIF HERE] +![pyglvis_using_keys](https://github.com/GLVis/pyglvis/assets/27717785/625f4f06-8f99-4390-94d7-4d317fd11e7f) ### Other methods @@ -164,4 +164,4 @@ git push --tags - PyMFEM ([github](https://github.com/mfem/pymfem), [pypi](https://pypi.org/project/mfem/)) - GLVis ([website](https://glvis.org/), [github](https://github.com/glvis/glvis)) - glvis-js ([github](https://github.com/glvis/glvis-js), [npm](https://www.npmjs.com/package/glvis), [esm](https://esm.sh/glvis)) -- pyglvis ([github](https://github.com/GLVis/pyglvis), [pypi]()) \ No newline at end of file +- pyglvis ([github](https://github.com/GLVis/pyglvis), [pypi]()) From 9a790a10489cd976152cc31b21fac80641ca4d12 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Mon, 24 Jun 2024 15:51:27 -0700 Subject: [PATCH 35/44] add copyright statement back into source files --- glvis/__init__.py | 11 +++++++++++ glvis/widget.js | 12 +++++++++++- glvis/widget.py | 11 +++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/glvis/__init__.py b/glvis/__init__.py index 4daa0bbe..222796e2 100644 --- a/glvis/__init__.py +++ b/glvis/__init__.py @@ -1,3 +1,14 @@ +# Copyright (c) 2010-2024, Lawrence Livermore National Security, LLC. Produced +# at the Lawrence Livermore National Laboratory. All Rights reserved. See files +# LICENSE and NOTICE for details. LLNL-CODE-443271. +# +# This file is part of the GLVis visualization tool and library. For more +# information and source code availability see https://glvis.org. +# +# GLVis is free software; you can redistribute it and/or modify it under the +# terms of the BSD-3 license. We welcome feedback and contributions, see file +# CONTRIBUTING.md for details. + from glvis.__about__ import __version__ from glvis.widget import glvis diff --git a/glvis/widget.js b/glvis/widget.js index e9f58a4b..3a73084f 100644 --- a/glvis/widget.js +++ b/glvis/widget.js @@ -1,4 +1,14 @@ -// _esm = """ +// Copyright (c) 2010-2024, Lawrence Livermore National Security, LLC. Produced +// at the Lawrence Livermore National Laboratory. All Rights reserved. See files +// LICENSE and NOTICE for details. LLNL-CODE-443271. +// +// This file is part of the GLVis visualization tool and library. For more +// information and source code availability see https://glvis.org. +// +// GLVis is free software; you can redistribute it and/or modify it under the +// terms of the BSD-3 license. We welcome feedback and contributions, see file +// CONTRIBUTING.md for details. + import glvis from "https://esm.sh/glvis"; function render({ model, el }) { diff --git a/glvis/widget.py b/glvis/widget.py index 2b3e875a..473cba8a 100644 --- a/glvis/widget.py +++ b/glvis/widget.py @@ -1,3 +1,14 @@ +# Copyright (c) 2010-2024, Lawrence Livermore National Security, LLC. Produced +# at the Lawrence Livermore National Laboratory. All Rights reserved. See files +# LICENSE and NOTICE for details. LLNL-CODE-443271. +# +# This file is part of the GLVis visualization tool and library. For more +# information and source code availability see https://glvis.org. +# +# GLVis is free software; you can redistribute it and/or modify it under the +# terms of the BSD-3 license. We welcome feedback and contributions, see file +# CONTRIBUTING.md for details. + import anywidget import io from IPython.display import display as ipydisplay From 22e4247d79bb84c61bb2cf0b5ea77dd30fef33a5 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Mon, 24 Jun 2024 16:33:16 -0700 Subject: [PATCH 36/44] use different key string if stream vs Mesh/GridFunction object --- glvis/widget.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/glvis/widget.py b/glvis/widget.py index 473cba8a..d79dbcac 100644 --- a/glvis/widget.py +++ b/glvis/widget.py @@ -52,7 +52,7 @@ class GlvisWidget(anywidget.AnyWidget): # The purpose of this wrapper class is to keep the API of Glvis clean by excluding inherited properties/methods class glvis: - def __init__(self, data: Data, width: int = 640, height: int = 480, keys=None): + def __init__(self, data: Data, width: int=640, height: int=480, keys=None): self._widget = GlvisWidget() self.set_size(width, height) self._sync(data, is_new=True, keys=keys) @@ -81,11 +81,12 @@ def _on_msg(self, _, content, buffers): with open(name, "wb") as f: f.write(base64.decodebytes(data.encode('ascii'))) - def _sync(self, data: Data, is_new: bool = True, keys=None): + def _sync(self, data: Data, is_new: bool=True, keys=None): self._widget.is_new_stream = is_new data_string = data_to_str(data) if keys is not None: - data_string += f"{keys}" + key_string = keys if isinstance(data, str) else f"keys {keys}" + data_string += key_string self._widget.data_str = data_string def render(self): From b51df1ed250a4241bab623aa1190800f368225db Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Mon, 24 Jun 2024 16:36:28 -0700 Subject: [PATCH 37/44] use 'keys' keyword in basic.ipynb --- examples/basic.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/basic.ipynb b/examples/basic.ipynb index 7e75b6b6..62d228e6 100644 --- a/examples/basic.ipynb +++ b/examples/basic.ipynb @@ -38,7 +38,7 @@ "outputs": [], "source": [ "# Another vsualization instance of the same stream\n", - "glvis(stream + 'rljg****tttac0', 300, 300)" + "glvis(stream, 300, 300, keys='rljg****tttac0')" ] } ], From 1ddd3b54cbeae5ecbccf481eff75a8432780be17 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Mon, 24 Jun 2024 17:30:19 -0700 Subject: [PATCH 38/44] update docstrings and change glvis() to be an aliased constructor while GlvisWidget is the main class --- glvis/__init__.py | 2 +- glvis/widget.py | 42 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/glvis/__init__.py b/glvis/__init__.py index 222796e2..d42444ab 100644 --- a/glvis/__init__.py +++ b/glvis/__init__.py @@ -10,6 +10,6 @@ # CONTRIBUTING.md for details. from glvis.__about__ import __version__ -from glvis.widget import glvis +from glvis.widget import glvis, GlvisWidget __all__ = ["glvis", "GlvisWidget", "__version__"] diff --git a/glvis/widget.py b/glvis/widget.py index d79dbcac..6adaba83 100644 --- a/glvis/widget.py +++ b/glvis/widget.py @@ -38,8 +38,17 @@ def data_to_str(data: Data) -> str: raise TypeError("Unknown data type") return sio.getvalue() -# Import file contents example: https://github.com/juba/pyobsplot/blob/main/src/pyobsplot/widget.py -class GlvisWidget(anywidget.AnyWidget): +class _GlvisWidgetCore(anywidget.AnyWidget): + """ + This is the backend that inherits from AnyWidget. Because we don't want all of the AnyWidget + properties/methods exposed to the user, the front-end class GlvisWidget is a composition + of this object, rather than directly inheriting from AnyWidget. + + _esm must be specified, and is basically a giant string with all of the javascript code required + It could be defined as a docstring here, but for organization and syntax highlighting, it is + defined in `widget.js`, similar to the organization used by pyobsplot: + https://github.com/juba/pyobsplot/blob/main/src/pyobsplot/widget.py + """ _esm = anywidget._file_contents.FileContents( Path(__file__).parent / "widget.js", start_thread=False ) @@ -50,10 +59,28 @@ class GlvisWidget(anywidget.AnyWidget): is_new_stream = Bool().tag(sync=True) -# The purpose of this wrapper class is to keep the API of Glvis clean by excluding inherited properties/methods -class glvis: +class GlvisWidget: + """ + Front-end class used to interactively visualize data. + """ def __init__(self, data: Data, width: int=640, height: int=480, keys=None): - self._widget = GlvisWidget() + """ + Parameters + ---------- + data : Union[Tuple[Mesh, GridFunction], Mesh, str] + Data to be visualized. Can consist of the PyMFEM objects: (Mesh, GridFunction) or Mesh, + or it can be read directly from a stream/string (see `examples/basic.ipynb`). + width : int, optional + Width of visualization + height : int, optional + Height of visualization + keys : str, optional + Keyboard commands to customize the visualization. Can also be typed into the widget + after it is instantiated. For a full list of options, see the GLVis README: + https://github.com/GLVis/glvis?tab=readme-ov-file#key-commands + """ + + self._widget = _GlvisWidgetCore() self.set_size(width, height) self._sync(data, is_new=True, keys=keys) @@ -91,3 +118,8 @@ def _sync(self, data: Data, is_new: bool=True, keys=None): def render(self): ipydisplay(self) + +# Constructor alias +def glvis(data: Data, width: int=640, height: int=480, keys=None): + return GlvisWidget(data, width, height, keys) +glvis.__doc__ = GlvisWidget.__init__.__doc__ \ No newline at end of file From 86d3051dcd88520a28a9b8fa2506bec0a9d113bc Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Tue, 25 Jun 2024 12:45:36 -0700 Subject: [PATCH 39/44] update anywidget dependency from 0.9.0[dev] to 0.9.9 (need repr_mimebundle) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index c7479bea..67965891 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ readme = "README.md" license = { file = "LICENSE" } dependencies = [ "mfem>=4.5.2", - "anywidget[dev]==0.9.0", + "anywidget>=0.9.9", "ipywidgets>=8.0.0" # required for _repr_mimebundle_ ] From 872a23ab00477eed7054dfb9baa12f3a555ab806 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Tue, 25 Jun 2024 12:54:20 -0700 Subject: [PATCH 40/44] add try/except to mfem imports, bump version --- glvis/__about__.py | 2 +- glvis/widget.py | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/glvis/__about__.py b/glvis/__about__.py index 3d26edf7..3d187266 100644 --- a/glvis/__about__.py +++ b/glvis/__about__.py @@ -1 +1 @@ -__version__ = "0.4.1" +__version__ = "0.5.0" diff --git a/glvis/widget.py b/glvis/widget.py index 6adaba83..bfa3ff08 100644 --- a/glvis/widget.py +++ b/glvis/widget.py @@ -17,8 +17,12 @@ from pathlib import Path import base64 -from mfem._ser.mesh import Mesh -from mfem._ser.gridfunc import GridFunction +try: + from mfem._ser.mesh import Mesh + from mfem._ser.gridfunc import GridFunction +except ImportError: + Mesh = object + GridFunction = object Data = Union[Tuple[Mesh, GridFunction], Mesh, str] From 767a12f8f52069581773b1f715a6f6fabedaf671 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Tue, 25 Jun 2024 12:57:43 -0700 Subject: [PATCH 41/44] more lax import for pymfem --- glvis/__about__.py | 2 +- glvis/widget.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/glvis/__about__.py b/glvis/__about__.py index 3d187266..dd9b22cc 100644 --- a/glvis/__about__.py +++ b/glvis/__about__.py @@ -1 +1 @@ -__version__ = "0.5.0" +__version__ = "0.5.1" diff --git a/glvis/widget.py b/glvis/widget.py index bfa3ff08..9e009b69 100644 --- a/glvis/widget.py +++ b/glvis/widget.py @@ -20,7 +20,7 @@ try: from mfem._ser.mesh import Mesh from mfem._ser.gridfunc import GridFunction -except ImportError: +except: Mesh = object GridFunction = object From 6ba51160a235966e56d842b9461346878e955639 Mon Sep 17 00:00:00 2001 From: justinlaughlin Date: Thu, 15 Aug 2024 19:49:37 -0700 Subject: [PATCH 42/44] use gh instead of npm for esm --- glvis/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glvis/widget.js b/glvis/widget.js index 3a73084f..07f00ac5 100644 --- a/glvis/widget.js +++ b/glvis/widget.js @@ -9,7 +9,7 @@ // terms of the BSD-3 license. We welcome feedback and contributions, see file // CONTRIBUTING.md for details. -import glvis from "https://esm.sh/glvis"; +import glvis from "https://esm.sh/gh/glvis/glvis-js"; function render({ model, el }) { let div = document.createElement("div"); From 6b901107cd37e80bc4c7f0e338c4d0b245b7b725 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Tue, 20 Aug 2024 11:10:14 -0700 Subject: [PATCH 43/44] Update README.md update binder links --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2478f001..4a929518 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # PyGLVis -[![badge](examples/basic.svg "Basic GLVis + Jupyter Example")](https://mybinder.org/v2/gh/GLVis/pyglvis/anywidget?filepath=examples%2Fbasic.ipynb) -[![badge](examples/plot.svg "Plot grid functions")](https://mybinder.org/v2/gh/GLVis/pyglvis/anywidget?filepath=examples%2Fplot.ipynb) -[![badge](examples/ex1.svg "MFEM's Example 1")](https://mybinder.org/v2/gh/GLVis/pyglvis/anywidget?filepath=examples%2Fex1.ipynb) -[![badge](examples/ex9.svg "MFEM's Example 9")](https://mybinder.org/v2/gh/GLVis/pyglvis/anywidget?filepath=examples%2Fex9.ipynb) +[![badge](examples/basic.svg "Basic GLVis + Jupyter Example")](https://mybinder.org/v2/gh/GLVis/pyglvis/HEAD?filepath=examples%2Fbasic.ipynb) +[![badge](examples/plot.svg "Plot grid functions")](https://mybinder.org/v2/gh/GLVis/pyglvis/HEAD?filepath=examples%2Fplot.ipynb) +[![badge](examples/ex1.svg "MFEM's Example 1")](https://mybinder.org/v2/gh/GLVis/pyglvis/HEAD?filepath=examples%2Fex1.ipynb) +[![badge](examples/ex9.svg "MFEM's Example 9")](https://mybinder.org/v2/gh/GLVis/pyglvis/HEAD?filepath=examples%2Fex9.ipynb) PyGLVis is an interactive [Jupyter](https://jupyter.org/) widget for visualizing finite element meshes and functions, built on-top of the [GLVis](https://glvis.org/) library. From f3d4b06af92de9a701b33ca097d9334160b55f20 Mon Sep 17 00:00:00 2001 From: Justin Laughlin Date: Tue, 27 Aug 2024 12:39:03 -0700 Subject: [PATCH 44/44] Update __about__.py version 1.0.0 --- glvis/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glvis/__about__.py b/glvis/__about__.py index dd9b22cc..5becc17c 100644 --- a/glvis/__about__.py +++ b/glvis/__about__.py @@ -1 +1 @@ -__version__ = "0.5.1" +__version__ = "1.0.0"