diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 615842d64e7..8939480c289 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -13,14 +13,13 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + - uses: actions/checkout@v4 with: persist-credentials: false - name: Install Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af + uses: actions/setup-node@v4 with: - node-version: 20 - cache: npm + node-version: 22 - name: Install dependencies run: npm ci - name: Build playground @@ -31,7 +30,7 @@ jobs: # It will still generate what it can, so it's safe to ignore the error continue-on-error: true - name: Upload artifact - uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa + uses: actions/upload-pages-artifact@v3 with: path: ./playground/ @@ -47,4 +46,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index de686d4f43b..43505523085 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -8,15 +8,15 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 + - uses: actions/checkout@v4 with: persist-credentials: false - name: Install Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af + uses: actions/setup-node@v4 with: - node-version: 20 + node-version: 22 cache: npm - run: npm ci - run: npm run lint - run: npm run build - - run: npm run test + - run: npm run tap diff --git a/package-lock.json b/package-lock.json index b38eab0ff5b..726bc65b390 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,14 +26,16 @@ "immutable": "3.8.2", "scratch-parser": "github:TurboWarp/scratch-parser#master", "scratch-sb1-converter": "0.2.7", - "scratch-translate-extension-languages": "0.0.20191118205314", + "scratch-translate-extension-languages": "^1.0.7", "text-encoding": "0.7.0", "uuid": "8.3.2", "worker-loader": "^1.1.1" }, "devDependencies": { "@babel/core": "7.13.10", + "@babel/eslint-parser": "7.23.3", "@babel/preset-env": "7.14.8", + "@turbowarp/scratch-svg-renderer": "1.1.0", "@types/tap": "^15.0.12", "adm-zip": "0.4.11", "babel-eslint": "10.1.0", @@ -70,18 +72,26 @@ "webpack-dev-server": "3.11.2" }, "peerDependencies": { - "@turbowarp/scratch-svg-renderer": "^1.0.0-202312300007-62fe825" + "@turbowarp/scratch-svg-renderer": "^1.1.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@babel/cli": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.25.6.tgz", - "integrity": "sha512-Z+Doemr4VtvSD2SNHTrkiFZ1LX+JI6tyRXAAOb4N9khIuPyoEPmTPJarPm8ljJV1D6bnMQjyHMWTT9NeKbQuXA==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", + "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "commander": "^6.2.0", + "@jridgewell/trace-mapping": "^0.3.17", + "commander": "^4.0.1", "convert-source-map": "^2.0.0", "fs-readdir-recursive": "^1.1.0", "glob": "^7.2.0", @@ -97,18 +107,17 @@ }, "optionalDependencies": { "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.6.0" + "chokidar": "^3.4.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/cli/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } @@ -117,15 +126,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@babel/cli/node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -139,7 +146,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -149,7 +155,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } @@ -159,30 +164,27 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "license": "MIT", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -192,7 +194,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.10.tgz", "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@babel/generator": "^7.13.9", @@ -219,16 +220,34 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/generator": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "node_modules/@babel/eslint-parser": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz", + "integrity": "sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -236,42 +255,38 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -280,18 +295,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", - "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.4", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" }, "engines": { @@ -302,13 +318,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -324,7 +339,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -340,57 +354,74 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -400,38 +431,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -441,15 +469,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -459,115 +486,113 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "license": "MIT", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz", + "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "license": "MIT", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.6" - }, "bin": { "parser": "bin/babel-parser.js" }, @@ -576,15 +601,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -599,7 +623,6 @@ "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", @@ -619,7 +642,6 @@ "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -637,7 +659,6 @@ "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.21.0", "@babel/helper-plugin-utils": "^7.20.2", @@ -656,7 +677,6 @@ "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -674,7 +694,6 @@ "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -692,7 +711,6 @@ "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -710,7 +728,6 @@ "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -728,7 +745,6 @@ "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -746,7 +762,6 @@ "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -764,7 +779,6 @@ "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-compilation-targets": "^7.20.7", @@ -785,7 +799,6 @@ "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -803,7 +816,6 @@ "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", @@ -822,7 +834,6 @@ "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -840,7 +851,6 @@ "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.21.0", @@ -860,7 +870,6 @@ "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -877,7 +886,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -890,7 +898,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -903,7 +910,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -919,7 +925,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -932,7 +937,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -945,7 +949,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -958,7 +961,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -971,7 +973,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -984,7 +985,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -997,7 +997,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1010,7 +1009,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1023,7 +1021,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1036,7 +1033,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1052,7 +1048,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1064,13 +1059,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1080,15 +1074,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1098,13 +1091,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1114,13 +1106,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1130,17 +1121,19 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", - "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.4", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", + "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { @@ -1151,14 +1144,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1168,13 +1160,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1184,14 +1175,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1201,13 +1191,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1217,14 +1206,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1234,14 +1222,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1251,15 +1238,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1269,13 +1255,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1285,13 +1270,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1301,14 +1285,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1318,15 +1301,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1336,16 +1318,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1355,14 +1336,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1372,14 +1352,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1389,13 +1368,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1405,14 +1383,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1422,14 +1399,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1440,13 +1416,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1456,13 +1431,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1472,13 +1446,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.22.5", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1489,13 +1462,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1505,13 +1477,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1521,14 +1492,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1538,13 +1508,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1554,13 +1523,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1570,13 +1538,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1586,13 +1553,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1602,14 +1568,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1623,7 +1588,6 @@ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.8.tgz", "integrity": "sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.14.7", "@babel/helper-compilation-targets": "^7.14.5", @@ -1711,7 +1675,6 @@ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -1727,15 +1690,13 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", + "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", "dev": true, - "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1744,32 +1705,33 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.6", - "@babel/parser": "^7.25.6", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1778,14 +1740,13 @@ } }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1797,7 +1758,6 @@ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -1813,7 +1773,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -1822,11 +1781,10 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1836,7 +1794,6 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1860,7 +1817,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -1876,7 +1832,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -1889,21 +1844,18 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "deprecated": "Use @eslint/config-array instead", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", "minimatch": "^3.0.5" }, "engines": { @@ -1915,7 +1867,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1925,19 +1876,16 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -1954,7 +1902,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -1964,7 +1911,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -1978,7 +1924,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -1992,7 +1937,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -2006,7 +1950,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -2019,7 +1962,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -2035,7 +1977,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -2048,7 +1989,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -2058,7 +1998,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -2068,59 +2007,53 @@ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, - "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", + "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2131,15 +2064,23 @@ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", "dev": true, - "license": "MIT", "optional": true }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2153,7 +2094,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } @@ -2163,7 +2103,6 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2177,7 +2116,6 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -2187,7 +2125,6 @@ "resolved": "https://registry.npmjs.org/@transifex/api/-/api-4.3.0.tgz", "integrity": "sha512-RCpqAqxZlrHDo7rfam8tLSoT02wvF8LQeNRC0VZG5IGrH+wv+G6fB8PWLLHrvUuaqO6XCwkMmYlJ/X9U9TLTHw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "core-js": "^3.22.4" }, @@ -2198,13 +2135,12 @@ "node_modules/@turbowarp/json": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@turbowarp/json/-/json-0.1.2.tgz", - "integrity": "sha512-9nWywp+0SH7ROVzQPQQO9gMWBikahsqyMWp1Ku8VV0q+q6bnx6dS0aNPTjqTtF2GHAY55hcREsqKzaoUdWBSwg==", - "license": "MIT" + "integrity": "sha512-9nWywp+0SH7ROVzQPQQO9gMWBikahsqyMWp1Ku8VV0q+q6bnx6dS0aNPTjqTtF2GHAY55hcREsqKzaoUdWBSwg==" }, "node_modules/@turbowarp/jszip": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/@turbowarp/jszip/-/jszip-3.11.1.tgz", - "integrity": "sha512-1tWXTxAac1T/g0VHC9lIY0Ij7Qyt7sORIaAT4L0/Y+pjU1ZtXD9ti/+RnXzTVHXp6AM8fM2O3mF22/aSEVPXiQ==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@turbowarp/jszip/-/jszip-3.12.0.tgz", + "integrity": "sha512-nTKFFc1rUToxTdxUKPIou3YKUsSelgEoyx4TAPzK/0BkGPntkenp9zoJOSnxnGWNchVXYVZv01+3aZwlS1K8hw==", "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { "lie": "~3.3.0", @@ -2213,33 +2149,94 @@ "setimmediate": "^1.0.5" } }, + "node_modules/@turbowarp/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/@turbowarp/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/@turbowarp/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/@turbowarp/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/@turbowarp/nanolog": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@turbowarp/nanolog/-/nanolog-0.2.0.tgz", - "integrity": "sha512-texcM9oxfEsADVlVDR5UhLkYclPKsV9mytJh+9pHHonNcUrxRVGF6FkJTzWO/Hl5NafU1crSdw737nqKE3atSA==", - "license": "MIT" + "integrity": "sha512-texcM9oxfEsADVlVDR5UhLkYclPKsV9mytJh+9pHHonNcUrxRVGF6FkJTzWO/Hl5NafU1crSdw737nqKE3atSA==" }, "node_modules/@turbowarp/sb3fix": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@turbowarp/sb3fix/-/sb3fix-0.3.2.tgz", - "integrity": "sha512-vrTT0tf3ax/wIodE/Hzcn5p9O4DWaTCaenS/HHhSvxgjgrOiP6wuqs0aTQqhaxYrEKA5ypjVq59+kbII0EOVVw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@turbowarp/sb3fix/-/sb3fix-0.5.0.tgz", + "integrity": "sha512-X5EOo+2nO3jIjEAzDY/Fmyn0wj6uAqOYXrRB9HAwTX4xWrmwvhuN/l8trVg/p+718/ySB9vQ7BGP2P0wklBCzw==", "license": "MPL-2.0", "dependencies": { - "@turbowarp/jszip": "^3.11.0" + "@turbowarp/jszip": "^3.12.0" } }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/@turbowarp/scratch-svg-renderer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@turbowarp/scratch-svg-renderer/-/scratch-svg-renderer-1.1.0.tgz", + "integrity": "sha512-UPSUNKfR9f73ZNgjYdxsz5yheZYO/EiKE3Wji31thRVDGzOJOROQXcFicl/1oDWkMII4FvSLylGAw6/MPpoXqg==", "dev": true, - "license": "MIT", + "license": "MPL-2.0", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@turbowarp/nanolog": "^0.2.0", + "base64-js": "1.2.1", + "base64-loader": "1.0.0", + "dompurify": "^3.4.5", + "transformation-matrix": "1.15.0" + }, + "peerDependencies": { + "scratch-render-fonts": "github:TurboWarp/scratch-render-fonts#master" + } + }, + "node_modules/@turbowarp/scratch-svg-renderer/node_modules/dompurify": { + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.12.tgz", + "integrity": "sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==", + "dev": true, + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, "node_modules/@types/babel__generator": { @@ -2247,7 +2244,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -2257,18 +2253,16 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } @@ -2278,7 +2272,6 @@ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, - "license": "MIT", "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -2288,24 +2281,21 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/node": { - "version": "22.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.6.1.tgz", - "integrity": "sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==", + "version": "20.10.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", + "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", "dev": true, - "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~5.26.4" } }, "node_modules/@types/tap": { @@ -2318,25 +2308,30 @@ "@types/node": "*" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/@vernier/godirect": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@vernier/godirect/-/godirect-1.5.0.tgz", - "integrity": "sha512-vMS0fQubI3WSSLg1Ry3aey/qWCl9XoCsFzgwOWYkeJs45YxjPel+42pLh5pO7uP6oF47sjZUKx8kGOoTiiiirA==", - "license": "BSD-3-Clause" + "integrity": "sha512-vMS0fQubI3WSSLg1Ry3aey/qWCl9XoCsFzgwOWYkeJs45YxjPel+42pLh5pO7uP6oF47sjZUKx8kGOoTiiiirA==" }, "node_modules/@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -2347,29 +2342,25 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@webassemblyjs/helper-code-frame": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/wast-printer": "1.9.0" } @@ -2378,15 +2369,13 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/@webassemblyjs/helper-module-context": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0" } @@ -2395,15 +2384,13 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -2416,7 +2403,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "dev": true, - "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -2426,7 +2412,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", "dev": true, - "license": "MIT", "dependencies": { "@xtuc/long": "4.2.2" } @@ -2435,15 +2420,13 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -2460,7 +2443,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", @@ -2474,7 +2456,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", @@ -2487,7 +2468,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-api-error": "1.9.0", @@ -2502,7 +2482,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/floating-point-hex-parser": "1.9.0", @@ -2517,7 +2496,6 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0", @@ -2528,15 +2506,13 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" + "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, - "license": "Apache-2.0" + "dev": true }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", @@ -2550,7 +2526,6 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -2560,11 +2535,10 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2576,7 +2550,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -2586,7 +2559,6 @@ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.3.0" } @@ -2596,7 +2568,6 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, - "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -2609,7 +2580,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2626,7 +2596,6 @@ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "dev": true, - "license": "MIT", "peerDependencies": { "ajv": ">=5.0.0" } @@ -2635,7 +2604,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } @@ -2645,7 +2613,6 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -2654,7 +2621,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -2667,7 +2633,6 @@ "engines": [ "node >= 0.8.0" ], - "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } @@ -2677,7 +2642,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -2686,7 +2650,6 @@ "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==", - "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -2698,7 +2661,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2712,7 +2674,6 @@ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, - "license": "MIT", "dependencies": { "default-require-extensions": "^3.0.0" }, @@ -2724,15 +2685,13 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/archive-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", "dev": true, - "license": "MIT", "dependencies": { "file-type": "^4.2.0" }, @@ -2745,7 +2704,6 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -2754,22 +2712,19 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" + "dev": true }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2779,7 +2734,6 @@ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2789,24 +2743,19 @@ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2816,22 +2765,19 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -2846,7 +2792,6 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, - "license": "MIT", "dependencies": { "array-uniq": "^1.0.1" }, @@ -2859,7 +2804,6 @@ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2869,39 +2813,15 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "call-bind": "^1.0.2", @@ -2921,7 +2841,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "call-bind": "^1.0.2", @@ -2937,28 +2856,23 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" } }, "node_modules/arraybuffer-loader": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/arraybuffer-loader/-/arraybuffer-loader-1.0.8.tgz", "integrity": "sha512-CwUVCcxCgcgZUu2w741OV6Xj1tvRVQebq22RCyGXiLgJOJ4e4M/59EPYdtK2MLfIN28t1TDvuh2ojstNq3Kh5g==", - "license": "MIT", "dependencies": { "loader-utils": "^1.1.0" }, @@ -2967,20 +2881,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -2995,36 +2907,33 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, - "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, - "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/assert": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", "dev": true, - "license": "MIT", "dependencies": { "object.assign": "^4.1.4", "util": "^0.10.4" @@ -3035,7 +2944,6 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8" } @@ -3044,15 +2952,13 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/assert/node_modules/util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "2.0.3" } @@ -3062,7 +2968,6 @@ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3081,7 +2986,6 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, - "license": "MIT", "dependencies": { "lodash": "^4.17.14" } @@ -3096,15 +3000,13 @@ "type": "individual", "url": "https://paulmillr.com/funding/" } - ], - "license": "MIT" + ] }, "node_modules/async-hook-domain": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-2.0.4.tgz", "integrity": "sha512-14LjCmlK1PK8eDtTezR6WX8TMaYNIzBIsd2D1sGoGjgx0BuNMMoSdk7i/drlbtamy0AWv9yv2tkB+ASdmeqFIw==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } @@ -3113,21 +3015,28 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", "dev": true, - "license": "MIT" + "optional": true, + "dependencies": { + "has-symbols": "^1.0.3" + } }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "license": "(MIT OR Apache-2.0)", "bin": { "atob": "bin/atob.js" }, @@ -3141,21 +3050,16 @@ "integrity": "sha512-b7ZmHGyjcAI3KmshPa4YSPxPbjglZQtKfZtzqhUfE3VeoANTsNffywkmujI32Sj31Aku/aB9s3BW4r3nmTF88g==", "deprecated": "Depends on Web-Audio-API implementation. Use either web-audio-api, web-audio-js or web-audio-engine package.", "dev": true, - "license": "MIT", "dependencies": { "global": "^4.3.1" } }, "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true, - "license": "MIT", "optional": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, "engines": { "node": ">= 0.4" }, @@ -3168,24 +3072,21 @@ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "dev": true, - "license": "MIT" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true }, "node_modules/babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^1.1.3", "esutils": "^2.0.2", @@ -3197,7 +3098,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3207,7 +3107,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3217,7 +3116,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -3233,15 +3131,13 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/babel-code-frame/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -3254,7 +3150,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -3265,7 +3160,6 @@ "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.7.0", @@ -3281,12 +3175,20 @@ "eslint": ">= 4.12.1" } }, + "node_modules/babel-eslint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/babel-loader": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", "dev": true, - "license": "MIT", "dependencies": { "find-cache-dir": "^3.3.1", "loader-utils": "^1.4.0", @@ -3306,7 +3208,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-extract-format-message/-/babel-plugin-extract-format-message-6.2.4.tgz", "integrity": "sha512-2nBVhei/madYmkgz2tY6BcCnoI9fNopyBsPqEVE1LAWSMwoxBFwECf35uBxiQDpKqIK/GKJ1BMRw7iN/ChqkWA==", "dev": true, - "license": "MIT", "dependencies": { "format-message-estree-util": "^6.2.4", "format-message-generate-id": "^6.2.4", @@ -3319,7 +3220,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/compat-data": "^7.13.11", "@babel/helper-define-polyfill-provider": "^0.2.4", @@ -3334,7 +3234,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.2.2", "core-js-compat": "^3.16.2" @@ -3348,7 +3247,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.2.4" }, @@ -3362,7 +3260,6 @@ "integrity": "sha512-1jlEJCSmLaJM4tjIKpu64UZ833COCHmwR77bFJDOye+zlwf80uR1b8p41l4tClx1QsrfI+qV6w/5AiPYQgaMUQ==", "deprecated": "this package has been renamed to babel-plugin-formatjs", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.4.5", "@babel/helper-plugin-utils": "^7.0.0", @@ -3376,7 +3273,6 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-format-message/-/babel-plugin-transform-format-message-6.2.4.tgz", "integrity": "sha512-MlvlDq3eZbllHzbBHo+SLSgKEThdddVRitODffdSQH1N9TbjQ+VhXg/RNlI1R5vQddxusg/NPzzGMZ9lfeJW1g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.0.0", "@babel/parser": "^7.0.0", @@ -3394,7 +3290,6 @@ "resolved": "https://registry.npmjs.org/format-message/-/format-message-6.2.4.tgz", "integrity": "sha512-/24zYeSRy2ZlEO2OIctm7jOHvMpoWf+uhqFCaqqyZKi1C229zAAy2E5vF4lSSaMH0a2kewPrOzq6xN4Yy7cQrw==", "dev": true, - "license": "MIT", "dependencies": { "format-message-formats": "^6.2.4", "format-message-interpret": "^6.2.4", @@ -3405,15 +3300,13 @@ "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==", - "license": "MIT" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, - "license": "MIT", "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -3432,7 +3325,6 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, - "license": "MIT", "dependencies": { "is-descriptor": "^1.0.0" }, @@ -3441,35 +3333,28 @@ } }, "node_modules/base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true }, "node_modules/base64-loader": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64-loader/-/base64-loader-1.0.0.tgz", "integrity": "sha512-p32+F8dg+ANGx7s8QsZS74ZPHfIycmC2yZcoerzFgbersIYWitPbbF39G6SBx3gyvzyLH5nt1ooocxr0IHuWKA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" } @@ -3478,21 +3363,16 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bind-obj-methods": { @@ -3500,7 +3380,6 @@ "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz", "integrity": "sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } @@ -3510,7 +3389,6 @@ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "file-uri-to-path": "1.0.0" @@ -3521,25 +3399,58 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "dev": true, - "license": "MIT", "dependencies": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" } }, + "node_modules/bl/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/body-parser": { "version": "1.20.3", @@ -3614,7 +3525,6 @@ "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", "dev": true, - "license": "MIT", "dependencies": { "array-flatten": "^2.1.0", "deep-equal": "^1.0.1", @@ -3628,7 +3538,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3651,7 +3560,6 @@ "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", "dev": true, - "license": "MIT", "dependencies": { "quote-stream": "^1.0.1", "resolve": "^1.1.5", @@ -3666,22 +3574,19 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", "integrity": "sha512-7Rfk377tpSM9TWBEeHs0FlDZGoAIei2V/4MdZJoFMBFAK6BqLpxAIUepGRHGdPFgGsLb02PXovC4qddyHvQqTg==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, - "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -3696,7 +3601,6 @@ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, - "license": "MIT", "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -3708,7 +3612,6 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, - "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -3721,32 +3624,29 @@ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, - "license": "MIT", "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" } }, "node_modules/browserify-sign": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", - "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dev": true, - "license": "ISC", "dependencies": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.5", - "hash-base": "~3.0", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "parse-asn1": "^5.1.7", - "readable-stream": "^2.3.8", + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", "safe-buffer": "^5.2.1" }, "engines": { - "node": ">= 0.12" + "node": ">= 4" } }, "node_modules/browserify-zlib": { @@ -3754,15 +3654,14 @@ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, - "license": "MIT", "dependencies": { "pako": "~1.0.5" } }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "dev": true, "funding": [ { @@ -3778,12 +3677,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -3796,7 +3694,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", - "license": "(MIT OR Apache-2.0)", "bin": { "btoa": "bin/btoa.js" }, @@ -3823,7 +3720,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -3834,7 +3730,6 @@ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, - "license": "MIT", "dependencies": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -3844,15 +3739,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, - "license": "MIT", "engines": { "node": "*" } @@ -3862,7 +3755,6 @@ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -3871,29 +3763,25 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true, - "license": "MIT" + "dev": true }, "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, - "license": "MIT" + "dev": true }, "node_modules/buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/buffer/node_modules/base64-js": { "version": "1.5.1", @@ -3913,22 +3801,19 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -3938,7 +3823,6 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "dev": true, - "license": "ISC", "dependencies": { "bluebird": "^3.5.1", "chownr": "^1.0.1", @@ -3960,7 +3844,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, - "license": "ISC", "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -3970,15 +3853,13 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, - "license": "MIT", "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -3999,7 +3880,6 @@ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==", "dev": true, - "license": "MIT", "dependencies": { "clone-response": "1.0.2", "get-stream": "3.0.0", @@ -4015,7 +3895,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -4024,15 +3903,13 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cacheable-request/node_modules/keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.0" } @@ -4042,7 +3919,6 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", "integrity": "sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4052,7 +3928,6 @@ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, - "license": "MIT", "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", @@ -4064,17 +3939,42 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -4088,7 +3988,6 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^0.2.0" }, @@ -4101,7 +4000,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4119,7 +4017,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", "engines": { "node": ">=6" } @@ -4128,15 +4025,14 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001663", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz", - "integrity": "sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==", + "version": "1.0.30001572", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz", + "integrity": "sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw==", "dev": true, "funding": [ { @@ -4151,28 +4047,24 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/canvas-toBlob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/canvas-toBlob/-/canvas-toBlob-1.0.0.tgz", - "integrity": "sha512-oU5bawygt/Nef9F+C49eTFmzXzz6yKdGqn6J1wn/LZQF5ulnnZVm0KIZzik85I6tjCbZFH6aa47j4bU2tkHxRw==", - "license": "MIT" + "integrity": "sha512-oU5bawygt/Nef9F+C49eTFmzXzz6yKdGqn6J1wn/LZQF5ulnnZVm0KIZzik85I6tjCbZFH6aa47j4bU2tkHxRw==" }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/catharsis": { "version": "0.8.11", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz", "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==", "dev": true, - "license": "MIT", "dependencies": { "lodash": "^4.17.14" }, @@ -4184,7 +4076,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4197,14 +4088,18 @@ "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "license": "MIT" + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -4217,9 +4112,6 @@ "engines": { "node": ">= 8.10.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -4228,7 +4120,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -4240,15 +4131,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "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, - "license": "MIT", "engines": { "node": ">=6.0" } @@ -4274,7 +4163,6 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -4285,15 +4173,13 @@ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, - "license": "MIT", "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -4309,7 +4195,6 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, - "license": "MIT", "dependencies": { "is-descriptor": "^0.1.0" }, @@ -4322,7 +4207,6 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dev": true, - "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -4336,7 +4220,6 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -4345,7 +4228,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "license": "MIT", "dependencies": { "restore-cursor": "^2.0.0" }, @@ -4356,15 +4238,13 @@ "node_modules/cli-width": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "license": "ISC" + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -4376,7 +4256,6 @@ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", "dev": true, - "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" } @@ -4386,7 +4265,6 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, - "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -4397,7 +4275,6 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4407,7 +4284,6 @@ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", "dev": true, - "license": "MIT", "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -4420,7 +4296,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -4428,15 +4303,13 @@ "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==", - "license": "MIT" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, - "license": "ISC", "bin": { "color-support": "bin.js" } @@ -4455,7 +4328,6 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -4467,22 +4339,19 @@ "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, - "license": "MIT" + "dev": true }, "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, - "license": "MIT" + "dev": true }, "node_modules/component-emitter": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -4492,7 +4361,6 @@ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -4505,7 +4373,6 @@ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -4524,7 +4391,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -4533,21 +4399,18 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" + "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==", - "license": "MIT" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -4557,7 +4420,6 @@ "engines": [ "node >= 0.8" ], - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -4565,12 +4427,47 @@ "typedarray": "^0.0.6" } }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8" } @@ -4585,15 +4482,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -4615,13 +4510,12 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "license": "MIT", "engines": { @@ -4632,16 +4526,13 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "deprecated": "This package is no longer supported.", "dev": true, - "license": "ISC", "dependencies": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -4656,7 +4547,6 @@ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4666,7 +4556,6 @@ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz", "integrity": "sha512-0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ==", "dev": true, - "license": "MIT", "dependencies": { "cacache": "^10.0.4", "find-cache-dir": "^1.0.0", @@ -4686,7 +4575,6 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", "integrity": "sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg==", "dev": true, - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^1.0.0", @@ -4701,7 +4589,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^2.0.0" }, @@ -4714,7 +4601,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -4728,7 +4614,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^3.0.0" }, @@ -4741,7 +4626,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^1.1.0" }, @@ -4754,7 +4638,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -4764,7 +4647,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^2.1.0" }, @@ -4773,25 +4655,23 @@ } }, "node_modules/core-js": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", - "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.0.tgz", + "integrity": "sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==", "dev": true, "hasInstallScript": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { - "version": "3.38.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", - "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", + "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", "dev": true, - "license": "MIT", "dependencies": { - "browserslist": "^4.23.3" + "browserslist": "^4.22.2" }, "funding": { "type": "opencollective", @@ -4799,11 +4679,10 @@ } }, "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, "node_modules/crc32": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/crc32/-/crc32-0.2.2.tgz", @@ -4821,7 +4700,6 @@ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, - "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -4831,15 +4709,13 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, - "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -4853,7 +4729,6 @@ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, - "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -4868,15 +4743,14 @@ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "dev": true, - "license": "MIT", "dependencies": { "node-fetch": "2.6.7" } }, "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==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -4893,7 +4767,6 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, - "license": "MIT", "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -4915,21 +4788,16 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, - "license": "ISC", "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, "node_modules/dashdash": { @@ -4937,7 +4805,6 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" }, @@ -4945,70 +4812,12 @@ "node": ">=0.10" } }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ms": "^2.1.3" + "ms": "2.1.2" }, "engines": { "node": ">=6.0" @@ -5023,7 +4832,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5031,15 +4839,13 @@ "node_modules/decode-html": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/decode-html/-/decode-html-2.0.0.tgz", - "integrity": "sha512-lVJ+EBozhAXA2nSQG+xAgcD0P5K3uejnIIvM09uoQfS8AALkQ+HhHcEUvKovXi0EIpIZWjm0y8X7ULjaJpgY9w==", - "license": "MIT" + "integrity": "sha512-lVJ+EBozhAXA2nSQG+xAgcD0P5K3uejnIIvM09uoQfS8AALkQ+HhHcEUvKovXi0EIpIZWjm0y8X7ULjaJpgY9w==" }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10" } @@ -5049,7 +4855,6 @@ "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", "dev": true, - "license": "MIT", "dependencies": { "decompress-tar": "^4.0.0", "decompress-tarbz2": "^4.0.0", @@ -5069,7 +4874,6 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dev": true, - "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" }, @@ -5082,7 +4886,6 @@ "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", "dev": true, - "license": "MIT", "dependencies": { "file-type": "^5.2.0", "is-stream": "^1.1.0", @@ -5097,7 +4900,6 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -5107,7 +4909,6 @@ "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", "dev": true, - "license": "MIT", "dependencies": { "decompress-tar": "^4.1.0", "file-type": "^6.1.0", @@ -5124,7 +4925,6 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -5134,7 +4934,6 @@ "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", "dev": true, - "license": "MIT", "dependencies": { "decompress-tar": "^4.1.1", "file-type": "^5.2.0", @@ -5149,7 +4948,6 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -5159,7 +4957,6 @@ "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", "dev": true, - "license": "MIT", "dependencies": { "file-type": "^3.8.0", "get-stream": "^2.2.0", @@ -5175,7 +4972,6 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5185,7 +4981,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", "dev": true, - "license": "MIT", "dependencies": { "object-assign": "^4.0.1", "pinkie-promise": "^2.0.0" @@ -5199,7 +4994,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5209,7 +5003,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^3.0.0" }, @@ -5222,7 +5015,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -5232,7 +5024,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5242,7 +5033,6 @@ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", "dev": true, - "license": "MIT", "dependencies": { "is-arguments": "^1.1.1", "is-date-object": "^1.0.5", @@ -5261,15 +5051,13 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "license": "MIT" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "execa": "^1.0.0", "ip-regex": "^2.1.0" @@ -5283,7 +5071,6 @@ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, - "license": "MIT", "dependencies": { "strip-bom": "^4.0.0" }, @@ -5295,21 +5082,17 @@ } }, "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, - "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -5317,7 +5100,6 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -5335,7 +5117,6 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, - "license": "MIT", "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -5349,7 +5130,6 @@ "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/glob": "^7.1.1", "globby": "^6.1.0", @@ -5368,7 +5148,6 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", "dev": true, - "license": "MIT", "dependencies": { "array-union": "^1.0.1", "glob": "^7.0.3", @@ -5385,7 +5164,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5395,7 +5173,6 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -5405,7 +5182,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -5415,7 +5191,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -5435,7 +5210,6 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -5456,15 +5230,13 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -5472,15 +5244,13 @@ "node_modules/diff-match-patch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.4.tgz", - "integrity": "sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg==", - "license": "Apache-2.0" + "integrity": "sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg==" }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, - "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -5491,15 +5261,13 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/dir-glob": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "dev": true, - "license": "MIT", "dependencies": { "path-type": "^3.0.0" }, @@ -5511,15 +5279,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/dns-packet": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, - "license": "MIT", "dependencies": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -5530,7 +5296,6 @@ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", "dev": true, - "license": "MIT", "dependencies": { "buffer-indexof": "^1.0.0" } @@ -5539,14 +5304,12 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/docdash/-/docdash-1.2.0.tgz", "integrity": "sha512-IYZbgYthPTspgqYeciRJNPhSwL51yer7HAwDXhF5p+H7mTDbPvY3PCk/QDjNxdPCpWkaJVFC4t7iCNB/t9E5Kw==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -5558,7 +5321,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "entities": "^2.0.0" @@ -5573,14 +5335,12 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/dom-serializer/node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -5596,7 +5356,6 @@ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4", "npm": ">=1.2" @@ -5605,14 +5364,12 @@ "node_modules/domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "license": "BSD-2-Clause" + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, "node_modules/domhandler": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "license": "BSD-2-Clause", "dependencies": { "domelementtype": "1" } @@ -5621,14 +5378,12 @@ "version": "2.2.7", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.2.7.tgz", "integrity": "sha512-jdtDffdGNY+C76jvodNTu9jt5yYj59vuTUyx+wXdzcSwAGTYZDAQkQ7Iwx9zcGrA4ixC1syU4H3RZROqRxokxg==", - "dev": true, - "license": "(MPL-2.0 OR Apache-2.0)" + "dev": true }, "node_modules/domutils": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "0", "domelementtype": "1" @@ -5639,7 +5394,6 @@ "resolved": "https://registry.npmjs.org/download/-/download-8.0.0.tgz", "integrity": "sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==", "dev": true, - "license": "MIT", "dependencies": { "archive-type": "^4.0.0", "content-disposition": "^0.5.2", @@ -5662,7 +5416,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -5676,7 +5429,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -5686,34 +5438,81 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" } }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, - "license": "MIT", "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -5721,12 +5520,47 @@ "stream-shift": "^1.0.0" } }, + "node_modules/duplexify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, - "license": "MIT", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -5740,16 +5574,15 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.28", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.28.tgz", - "integrity": "sha512-VufdJl+rzaKZoYVUijN13QcXVF5dWPZANeFTLNy+OSpHdDL5ynXTF35+60RSBbaQYB1ae723lQXHCrf4pyLsMw==", - "dev": true, - "license": "ISC" + "version": "1.4.617", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.617.tgz", + "integrity": "sha512-sYNE3QxcDS4ANW1k4S/wWYMXjCVcFSOX3Bg8jpuMFaXt/x8JCmp0R1Xe1ZXDX4WXnSRBf+GJ/3eGWicUuQq5cg==", + "dev": true }, "node_modules/elliptic": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", - "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, "license": "MIT", "dependencies": { @@ -5766,21 +5599,18 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" + "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==", - "license": "MIT", "engines": { "node": ">= 4" } @@ -5800,7 +5630,6 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -5819,12 +5648,17 @@ "node": ">=6.9.0" } }, + "node_modules/enhanced-resolve/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, "node_modules/enhanced-resolve/node_modules/memory-fs": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "dev": true, - "license": "MIT", "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" @@ -5833,79 +5667,99 @@ "node": ">=4.3.0 <5.0.0 || >=5.10" } }, - "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "license": "BSD-2-Clause" - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/enhanced-resolve/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/enhanced-resolve/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/enhanced-resolve/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es-abstract": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", + "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", + "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -5915,14 +5769,11 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -5938,39 +5789,34 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", - "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", + "internal-slot": "^1.0.5", "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" + "safe-array-concat": "^1.0.1" } }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -5979,16 +5825,15 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -5999,7 +5844,6 @@ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "hasown": "^2.0.0" @@ -6010,7 +5854,6 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "is-callable": "^1.1.4", @@ -6045,15 +5888,13 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dev": true, - "license": "MIT", "dependencies": { "d": "1", "es5-ext": "^0.10.35", @@ -6065,7 +5906,6 @@ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", "dev": true, - "license": "MIT", "dependencies": { "d": "1", "es5-ext": "~0.10.14", @@ -6080,7 +5920,6 @@ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.6.tgz", "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", "dev": true, - "license": "ISC", "dependencies": { "d": "^1.0.1", "es5-ext": "^0.10.62", @@ -6093,18 +5932,20 @@ "node": ">=0.12" } }, + "node_modules/es6-set/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dev": true, - "license": "ISC", "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "engines": { - "node": ">=0.12" + "d": "^1.0.1", + "ext": "^1.1.2" } }, "node_modules/es6-weak-map": { @@ -6112,7 +5953,6 @@ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dev": true, - "license": "ISC", "dependencies": { "d": "1", "es5-ext": "^0.10.46", @@ -6121,11 +5961,10 @@ } }, "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -6134,14 +5973,12 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" + "dev": true }, "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==", - "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -6151,7 +5988,6 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esprima": "^3.1.3", "estraverse": "^4.2.0", @@ -6174,7 +6010,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -6184,7 +6019,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -6198,7 +6032,6 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -6225,7 +6058,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -6236,7 +6068,6 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2" }, @@ -6249,7 +6080,6 @@ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha512-75IUQsusDdalQEW/G/2esa87J7raqdJF+Ca0/Xm5C3Q58Nr4yVYjZGp/P1+2xiEVgXRrA39dpRb8LcshajbqDQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "es6-map": "^0.1.3", "es6-weak-map": "^2.0.1", @@ -6265,7 +6095,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -6275,7 +6104,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -6376,10 +6204,42 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/eslint-auto-fix/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/eslint-auto-fix/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-auto-fix/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/eslint-auto-fix/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "license": "MIT", "dependencies": { "nice-try": "^1.0.4", @@ -6392,10 +6252,17 @@ "node": ">=4.8" } }, + "node_modules/eslint-auto-fix/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "license": "MIT" + }, "node_modules/eslint-auto-fix/node_modules/eslint": { "version": "5.16.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -6455,6 +6322,15 @@ "node": ">=4.0.0" } }, + "node_modules/eslint-auto-fix/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-auto-fix/node_modules/espree": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", @@ -6503,6 +6379,18 @@ "node": ">=4" } }, + "node_modules/eslint-auto-fix/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/eslint-auto-fix/node_modules/flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -6532,10 +6420,19 @@ "node": ">= 4" } }, + "node_modules/eslint-auto-fix/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-auto-fix/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.0.tgz", + "integrity": "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==", "license": "MIT", "dependencies": { "argparse": "^1.0.7", @@ -6558,6 +6455,19 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-auto-fix/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/eslint-auto-fix/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -6575,6 +6485,51 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-auto-fix/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==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-auto-fix/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-auto-fix/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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-auto-fix/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/eslint-auto-fix/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -6592,6 +6547,15 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-auto-fix/node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/eslint-auto-fix/node_modules/rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -6635,28 +6599,92 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-auto-fix/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/eslint-auto-fix/node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "license": "MIT", "dependencies": { - "ansi-regex": "^3.0.0" + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/eslint-auto-fix/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "node_modules/eslint-auto-fix/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/eslint-auto-fix/node_modules/type-check": { + "node_modules/eslint-auto-fix/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-auto-fix/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-auto-fix/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-auto-fix/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-auto-fix/node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint-auto-fix/node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", @@ -6680,12 +6708,86 @@ "which": "bin/which" } }, + "node_modules/eslint-auto-fix/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-auto-fix/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-auto-fix/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-auto-fix/node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "license": "MIT", + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-auto-fix/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/eslint-auto-fix/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, "node_modules/eslint-config-scratch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/eslint-config-scratch/-/eslint-config-scratch-9.0.3.tgz", "integrity": "sha512-BSMx4Y6V7IjDW/thMXLAYTxKvjeI4M8RtHmbpUbx3N70CZV4armoA9zJ7RmER1hjV5KQebCVQy45A2xMj2Ng8w==", "dev": true, - "license": "BSD-3-Clause", "optionalDependencies": { "eslint-plugin-react": ">=7.27.0" }, @@ -6699,7 +6801,6 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-format-message/-/eslint-plugin-format-message-6.2.4.tgz", "integrity": "sha512-hibY1D1jd2GXFT0Pl5Mb1QGHQT/zSPJji+CQhWH1p6/r3Nub7sdZwxp2VUj8wGAvQSbn/tkepc2Ig7i450cAvQ==", "dev": true, - "license": "MIT", "dependencies": { "format-message": "^6.2.4", "format-message-estree-util": "^6.2.4", @@ -6716,7 +6817,6 @@ "resolved": "https://registry.npmjs.org/format-message/-/format-message-6.2.4.tgz", "integrity": "sha512-/24zYeSRy2ZlEO2OIctm7jOHvMpoWf+uhqFCaqqyZKi1C229zAAy2E5vF4lSSaMH0a2kewPrOzq6xN4Yy7cQrw==", "dev": true, - "license": "MIT", "dependencies": { "format-message-formats": "^6.2.4", "format-message-interpret": "^6.2.4", @@ -6725,37 +6825,34 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.36.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz", - "integrity": "sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", - "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", + "resolve": "^2.0.0-next.4", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" + "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "node_modules/eslint-plugin-react/node_modules/doctrine": { @@ -6763,7 +6860,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "optional": true, "dependencies": { "esutils": "^2.0.2" @@ -6777,7 +6873,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "is-core-module": "^2.13.0", @@ -6792,20 +6887,27 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "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, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "estraverse": "^4.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" } }, "node_modules/eslint-utils": { @@ -6820,7 +6922,7 @@ "node": ">=6" } }, - "node_modules/eslint-visitor-keys": { + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", @@ -6829,12 +6931,21 @@ "node": ">=4" } }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6850,7 +6961,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6867,7 +6977,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -6879,15 +6988,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -6895,12 +7002,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -6913,7 +7035,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -6929,7 +7050,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -6939,7 +7059,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6952,7 +7071,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6965,7 +7083,6 @@ "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -6986,12 +7103,18 @@ "node": ">=0.10" } }, + "node_modules/esniff/node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "dev": true, + "license": "ISC" + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -7009,7 +7132,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -7022,7 +7144,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", "dev": true, - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -7032,10 +7153,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "license": "BSD-3-Clause", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dependencies": { "estraverse": "^5.1.0" }, @@ -7047,7 +7167,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -7059,7 +7178,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -7068,7 +7186,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -7088,7 +7205,6 @@ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", "dev": true, - "license": "MIT", "dependencies": { "d": "1", "es5-ext": "~0.10.14" @@ -7098,15 +7214,13 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true, - "license": "MIT" + "dev": true }, "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, - "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -7115,15 +7229,13 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/eventsource": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.0.0" } @@ -7133,7 +7245,6 @@ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, - "license": "MIT", "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -7144,7 +7255,6 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -7159,9 +7269,9 @@ } }, "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "license": "MIT", "dependencies": { @@ -7180,7 +7290,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -7190,7 +7299,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } @@ -7200,7 +7308,6 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^1.0.0" }, @@ -7213,7 +7320,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7223,7 +7329,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -7236,7 +7341,6 @@ "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", "integrity": "sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7246,7 +7350,6 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -7265,7 +7368,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -7275,7 +7377,6 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, - "license": "MIT", "dependencies": { "is-descriptor": "^0.1.0" }, @@ -7288,7 +7389,6 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, - "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -7301,7 +7401,6 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dev": true, - "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -7315,7 +7414,6 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7324,15 +7422,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/exports-loader": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/exports-loader/-/exports-loader-0.7.0.tgz", "integrity": "sha512-RKwCrO4A6IiKm0pG3c9V46JxIHcDplwwGJn6+JJ1RcVnh/WSGJa0xkmk5cRVtgOPzCAtTMGj2F7nluh9L0vpSA==", "dev": true, - "license": "MIT", "dependencies": { "loader-utils": "^1.1.0", "source-map": "0.5.0" @@ -7346,7 +7442,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.0.tgz", "integrity": "sha512-gjGnxNN0K+/Pr4Mi4fs/pOtda10dKB6Wn9QvjOrH6v5TWsI7ghHuJUHoIgyM6DkUL5kr2GtPFGererzKpMBWfA==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -7356,7 +7451,6 @@ "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.5.tgz", "integrity": "sha512-iPowgKUZkTPX5PznYsmifVj9Bob0w2wTHVkt/eYNPSzyebkUgIedmskf/kcfEIWpiWjg3JRjnW+a17XypySMuw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4.3 < 5.0.0 || >= 5.10" }, @@ -7365,9 +7459,9 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "license": "MIT", "dependencies": { @@ -7376,7 +7470,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -7390,7 +7484,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -7405,21 +7499,23 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -7428,8 +7524,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/express/node_modules/qs": { "version": "6.13.0", @@ -7452,7 +7547,6 @@ "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dev": true, - "license": "ISC", "dependencies": { "type": "^2.7.2" } @@ -7462,7 +7556,6 @@ "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": "^1.28.0" }, @@ -7475,7 +7568,6 @@ "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", "dev": true, - "license": "MIT", "dependencies": { "ext-list": "^2.0.0", "sort-keys-length": "^1.0.0" @@ -7484,19 +7576,23 @@ "node": ">=4" } }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, - "license": "MIT", "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -7509,7 +7605,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "license": "MIT", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -7524,7 +7619,6 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, - "license": "MIT", "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -7544,7 +7638,6 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, - "license": "MIT", "dependencies": { "is-descriptor": "^1.0.0" }, @@ -7557,7 +7650,6 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, - "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -7570,7 +7662,6 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7582,15 +7673,13 @@ "dev": true, "engines": [ "node >=0.6.0" - ], - "license": "MIT" + ] }, "node_modules/falafel": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", "dev": true, - "license": "MIT", "dependencies": { "acorn": "^7.1.1", "isarray": "^2.0.1" @@ -7604,7 +7693,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -7612,44 +7700,32 @@ "node": ">=0.4.0" } }, - "node_modules/falafel/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, "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==", - "license": "MIT" + "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==", - "license": "MIT" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "license": "MIT" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fastestsmallesttextencoderdecoder": { "version": "1.0.22", "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", - "dev": true, - "license": "CC0-1.0" + "dev": true }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -7659,7 +7735,6 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, - "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -7672,7 +7747,6 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, - "license": "MIT", "dependencies": { "pend": "~1.2.0" } @@ -7682,14 +7756,12 @@ "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "deprecated": "This module is no longer supported.", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -7702,7 +7774,6 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -7715,7 +7786,6 @@ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", "dev": true, - "license": "MIT", "dependencies": { "loader-utils": "^1.0.2", "schema-utils": "^1.0.0" @@ -7732,7 +7802,6 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -7747,7 +7816,6 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-11.1.0.tgz", "integrity": "sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -7757,7 +7825,6 @@ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/filename-reserved-regex": { @@ -7765,7 +7832,6 @@ "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -7775,7 +7841,6 @@ "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-3.0.0.tgz", "integrity": "sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==", "dev": true, - "license": "MIT", "dependencies": { "filename-reserved-regex": "^2.0.0", "strip-outer": "^1.0.0", @@ -7838,7 +7903,6 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -7856,7 +7920,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -7896,8 +7959,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", "integrity": "sha512-ENZS237/Hr8bjczn5eKuBohLgaD0JyUd0arxretR1f9RO46vZHA1b2y0VorgGV3WaOT3c+78P8h7v4JGJ1i/rg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/findup": { "version": "0.1.5", @@ -7929,7 +7991,6 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -7943,9 +8004,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -7957,23 +8016,57 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true, - "license": "ISC" + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true }, "node_modules/flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" } }, + "node_modules/flush-write-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/flush-write-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/flush-write-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/flush-write-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -8000,7 +8093,6 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "is-callable": "^1.1.3" @@ -8011,7 +8103,6 @@ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8021,7 +8112,6 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, - "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" @@ -8035,7 +8125,6 @@ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "*" } @@ -8045,7 +8134,6 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, - "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -8059,7 +8147,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/format-message/-/format-message-6.2.1.tgz", "integrity": "sha512-6gBXI+MOE9pu9QNeZf95V87GKYiLCdUvhisjts75xonaPAshtBu20NTZt2l8kbYcoMtxNyH9E9af+aieIRfVmw==", - "license": "MIT", "dependencies": { "format-message-formats": "^6.2.0", "format-message-interpret": "^6.2.0", @@ -8072,7 +8159,6 @@ "resolved": "https://registry.npmjs.org/format-message-cli/-/format-message-cli-6.2.0.tgz", "integrity": "sha512-NpbIyGj6oqpGwtKJlV3PeVUqRwpbfdnDEdd9QGkABQ1hTIguGyQAQyKH23hBKWKTaqvI1IY2LHBqGkEtwa/Sgg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.0.0", "babel-plugin-extract-format-message": "^6.2.0", @@ -8095,7 +8181,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -8108,7 +8193,6 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha512-AU7pnZkguthwBjKgCg6998ByQNIMjbuDQZ8bb78QAFZwPfmKia8AIzgY/gWgqCjnht8JLdXmB4YxA0KaV60ncQ==", "dev": true, - "license": "MIT", "dependencies": { "acorn": "^3.0.4" } @@ -8118,7 +8202,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -8126,33 +8209,11 @@ "node": ">=0.4.0" } }, - "node_modules/format-message-cli/node_modules/ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha512-I/bSHSNEcFFqXLf91nchoNB9D1Kie3QKcWdchYUaoIg1+1bdWDkdfdlvdIOJbi9U8xR0y+MWc5D+won9v95WlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "node_modules/format-message-cli/node_modules/ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha512-vuBv+fm2s6cqUyey2A7qYcvsik+GMDJsw8BARP2sDE76cqmaZVarsvHf7Vx6VJ0Xk8gLl+u3MoAPf6gKzJefeA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": ">=4.10.0" - } - }, "node_modules/format-message-cli/node_modules/ansi-escapes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", "integrity": "sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8162,7 +8223,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8172,7 +8232,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8182,7 +8241,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -8192,7 +8250,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -8209,7 +8266,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", "integrity": "sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==", "dev": true, - "license": "MIT", "dependencies": { "restore-cursor": "^1.0.1" }, @@ -8222,7 +8278,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -8232,7 +8287,6 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -8245,7 +8299,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", "integrity": "sha512-x6LJGXWCGB/4YOBhL48yeppZTo+YQUNC37N5qqCpC1b1kkNzydlQHQAtPuUSFoZSxgIadrysQoW2Hq602P+uEA==", "dev": true, - "license": "MIT", "dependencies": { "babel-code-frame": "^6.16.0", "chalk": "^1.1.3", @@ -8294,9 +8347,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8317,7 +8368,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^5.5.0", "acorn-jsx": "^3.0.0" @@ -8331,7 +8381,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -8345,7 +8394,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -8355,7 +8403,6 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5", "object-assign": "^4.1.0" @@ -8369,7 +8416,6 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha512-uXP/zGzxxFvFfcZGgBIwotm+Tdc55ddPAzF7iHshP4YGaXMww7rSF9peD9D1sui5ebONg5UobsZv+FfgEpGv/w==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^1.2.1", "object-assign": "^4.0.1" @@ -8383,7 +8429,6 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, - "license": "MIT", "dependencies": { "circular-json": "^0.3.1", "graceful-fs": "^4.1.2", @@ -8398,9 +8443,7 @@ "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "inflight": "^1.0.4", "inherits": "2", @@ -8417,7 +8460,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8426,15 +8468,13 @@ "version": "3.3.10", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/format-message-cli/node_modules/inquirer": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", "integrity": "sha512-bOetEz5+/WpgaW4D1NYOk1aD+JCqRjqu/FwRFgnIfiP7FC/zinsrfyO1vlS3nyH/R7S0IH3BIHBu4DBIDSqiGQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-escapes": "^1.1.0", "ansi-regex": "^2.0.0", @@ -8456,7 +8496,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, - "license": "MIT", "dependencies": { "number-is-nan": "^1.0.0" }, @@ -8469,7 +8508,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -8483,7 +8521,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -8496,15 +8533,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/format-message-cli/node_modules/onetime": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8514,7 +8549,6 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -8536,21 +8570,11 @@ "node": ">= 0.8.0" } }, - "node_modules/format-message-cli/node_modules/progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/format-message-cli/node_modules/restore-cursor": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", "integrity": "sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==", "dev": true, - "license": "MIT", "dependencies": { "exit-hook": "^1.0.0", "onetime": "^1.0.0" @@ -8563,9 +8587,7 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -8577,9 +8599,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8600,27 +8620,15 @@ "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", "integrity": "sha512-qOX+w+IxFgpUpJfkv2oGN0+ExPs68F4sZHfaRRx4dDexAQkG83atugKVEylyT5ARees3HBbfmuvnjbrd8j9Wjw==", "dev": true, - "license": "MIT", "dependencies": { "once": "^1.3.0" } }, - "node_modules/format-message-cli/node_modules/slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/format-message-cli/node_modules/string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, - "license": "MIT", "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -8635,7 +8643,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -8648,7 +8655,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -8658,7 +8664,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8668,79 +8673,15 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } }, - "node_modules/format-message-cli/node_modules/table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha512-RZuzIOtzFbprLCE0AXhkI0Xi42ZJLZhCC+qkwuMLf/Vjz3maWpA8gz1qMdbmNoI9cOROT2Am/DxeRyXenrL11g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", - "slice-ansi": "0.0.4", - "string-width": "^2.0.0" - } - }, - "node_modules/format-message-cli/node_modules/table/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/format-message-cli/node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/format-message-cli/node_modules/table/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/format-message-cli/node_modules/table/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/format-message-cli/node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2" }, @@ -8748,38 +8689,22 @@ "node": ">= 0.8.0" } }, - "node_modules/format-message-cli/node_modules/write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/format-message-estree-util": { "version": "6.2.4", "resolved": "https://registry.npmjs.org/format-message-estree-util/-/format-message-estree-util-6.2.4.tgz", "integrity": "sha512-GymGOfLzVnuDiBONl7Bq00L3ff7kk6qoX2x90V1ZNyjjQMZdexS/4YXxSS00VicDpEMOCxvuO8oUNB/o1o0avA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/format-message-formats": { "version": "6.2.4", "resolved": "https://registry.npmjs.org/format-message-formats/-/format-message-formats-6.2.4.tgz", - "integrity": "sha512-smT/fAqBLqusWfWCKRAx6QBDAAbmYznWsIyTyk66COmvwt2Byiqd7SJe2ma9a5oV0kwRaOJpN/F4lr4YK/n6qQ==", - "license": "MIT" + "integrity": "sha512-smT/fAqBLqusWfWCKRAx6QBDAAbmYznWsIyTyk66COmvwt2Byiqd7SJe2ma9a5oV0kwRaOJpN/F4lr4YK/n6qQ==" }, "node_modules/format-message-generate-id": { "version": "6.2.4", "resolved": "https://registry.npmjs.org/format-message-generate-id/-/format-message-generate-id-6.2.4.tgz", "integrity": "sha512-yx+sq5Thn0u5bMyy1qNkNA45nJSCskfOPXHx7KoDu/WCF/qudmXqvmuuS8ntz9qikH37ggAfiLM8Zrm0Fh+H7A==", "dev": true, - "license": "MIT", "dependencies": { "crc32": "^0.2.2", "format-message-parse": "^6.2.4", @@ -8790,7 +8715,6 @@ "version": "6.2.4", "resolved": "https://registry.npmjs.org/format-message-interpret/-/format-message-interpret-6.2.4.tgz", "integrity": "sha512-dRvz9mXhITApyOtfuFEb/XqvCe1u6RMkQW49UJHXS8w2S8cAHCqq5LNDFK+QK6XVzcofROycLb/k1uybTAKt2w==", - "license": "MIT", "dependencies": { "format-message-formats": "^6.2.4", "lookup-closest-locale": "^6.2.0" @@ -8799,22 +8723,19 @@ "node_modules/format-message-parse": { "version": "6.2.4", "resolved": "https://registry.npmjs.org/format-message-parse/-/format-message-parse-6.2.4.tgz", - "integrity": "sha512-k7WqXkEzgXkW4wkHdS6Cv2Ou0rIFtiDelZjgoe1saW4p7FT7zS8OeAUpAekhormqzpeecR97e4vBft1zMsfFOQ==", - "license": "MIT" + "integrity": "sha512-k7WqXkEzgXkW4wkHdS6Cv2Ou0rIFtiDelZjgoe1saW4p7FT7zS8OeAUpAekhormqzpeecR97e4vBft1zMsfFOQ==" }, "node_modules/format-message-print": { "version": "6.2.4", "resolved": "https://registry.npmjs.org/format-message-print/-/format-message-print-6.2.4.tgz", "integrity": "sha512-72j+ATEN13NFJ1hYaPcDVJEE37BD1P29plLIdCqEMwezVa1c7VSPgRB1eZnkoWxm4YKFgS770pJlE1ZczACqgQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8824,7 +8745,6 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", "dev": true, - "license": "MIT", "dependencies": { "map-cache": "^0.2.2" }, @@ -8847,7 +8767,6 @@ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -8858,22 +8777,57 @@ "resolved": "https://registry.npmjs.org/from2-array/-/from2-array-0.0.4.tgz", "integrity": "sha512-0G0cAp7sYLobH7ALsr835x98PU/YeVF7wlwxdWbCUaea7wsa7lJfKZUAo6p2YZGZ8F94luCuqHZS3JtFER6uPg==", "dev": true, - "license": "MIT", "dependencies": { "from2": "^2.0.3" } }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { "type": "patreon", "url": "https://www.patreon.com/feross" }, @@ -8881,29 +8835,25 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fs-exists-cached": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", "integrity": "sha512-kSxoARUDn4F2RPXX48UXnaFKwVU7Ivd/6qpzZL29MCDmr9sTvybv4gFCp+qaI4fM9m0z9fgz/yJvi56GAz+BZg==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -8917,16 +8867,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", - "deprecated": "This package is no longer supported.", "dev": true, - "license": "ISC", "dependencies": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -8934,18 +8881,52 @@ "readable-stream": "1 || 2" } }, + "node_modules/fs-write-stream-atomic/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/fs-write-stream-atomic/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fs-write-stream-atomic/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "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==", - "license": "ISC" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -8959,7 +8940,6 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8968,15 +8948,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", "integrity": "sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/function.prototype.name": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "call-bind": "^1.0.2", @@ -9002,7 +8980,6 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9012,7 +8989,6 @@ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", "dev": true, - "license": "MIT", "dependencies": { "is-property": "^1.0.2" } @@ -9022,7 +8998,6 @@ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", "dev": true, - "license": "MIT", "dependencies": { "is-property": "^1.0.0" } @@ -9032,7 +9007,6 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -9041,23 +9015,27 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", "dev": true, "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9071,17 +9049,29 @@ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, - "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -9090,27 +9080,24 @@ } }, "node_modules/get-stream/node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, - "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -9124,7 +9111,6 @@ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9134,7 +9120,6 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" } @@ -9143,8 +9128,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9165,7 +9148,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -9178,7 +9160,6 @@ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "dev": true, - "license": "MIT", "dependencies": { "min-document": "^2.19.0", "process": "^0.11.10" @@ -9188,28 +9169,24 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -9223,7 +9200,6 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", "dev": true, - "license": "MIT", "dependencies": { "array-union": "^1.0.1", "dir-glob": "^2.0.0", @@ -9240,17 +9216,16 @@ "version": "3.3.10", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9261,7 +9236,6 @@ "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", "dev": true, - "license": "MIT", "dependencies": { "@sindresorhus/is": "^0.7.0", "cacheable-request": "^2.1.1", @@ -9290,7 +9264,6 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -9299,15 +9272,13 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/grapheme-breaker": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz", "integrity": "sha512-mB6rwkw1Z7z4z2RkFFTd/+q6Ug1gnCgjKAervAKgBeNI1mSr8E5EUWoYzFNOZsLHFArLfpk+O8X8qXC7uvuawQ==", "dev": true, - "license": "MIT", "dependencies": { "brfs": "^1.2.0", "unicode-trie": "^0.3.1" @@ -9317,15 +9288,13 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.x" } @@ -9334,15 +9303,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true, - "license": "ISC", "engines": { "node": ">=4" } @@ -9353,7 +9320,6 @@ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -9367,7 +9333,6 @@ "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -9377,7 +9342,6 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -9390,7 +9354,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9400,7 +9363,6 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "license": "MIT", "optional": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9410,30 +9372,28 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, - "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, - "license": "MIT", + "optional": true, "engines": { "node": ">= 0.4" }, @@ -9446,15 +9406,14 @@ "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", "dev": true, - "license": "MIT", "engines": { "node": "*" } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { @@ -9469,7 +9428,6 @@ "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "dev": true, - "license": "MIT", "dependencies": { "has-symbol-support-x": "^1.4.1" }, @@ -9478,13 +9436,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dev": true, - "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -9498,7 +9455,6 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", "dev": true, - "license": "MIT", "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -9513,7 +9469,6 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -9527,7 +9482,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, - "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -9540,7 +9494,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, - "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -9553,7 +9506,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", "dev": true, - "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -9562,14 +9514,14 @@ } }, "node_modules/hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, - "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "engines": { "node": ">=4" @@ -9580,7 +9532,6 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -9591,7 +9542,6 @@ "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, - "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" @@ -9608,7 +9558,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -9634,7 +9583,6 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", "dev": true, - "license": "MIT", "bin": { "he": "bin/he" } @@ -9644,7 +9592,6 @@ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, - "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -9655,15 +9602,13 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -9671,25 +9616,58 @@ "wbuf": "^1.1.0" } }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/html-entities": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/htmlparser2": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", - "license": "MIT", "dependencies": { "domelementtype": "^1.3.0", "domhandler": "^2.3.0", @@ -9699,33 +9677,17 @@ "readable-stream": "^3.0.6" } }, - "node_modules/htmlparser2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/http-errors": { "version": "2.0.0", @@ -9748,15 +9710,13 @@ "version": "0.5.8", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, - "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -9771,7 +9731,6 @@ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dev": true, - "license": "MIT", "dependencies": { "http-proxy": "^1.17.0", "is-glob": "^4.0.0", @@ -9787,7 +9746,6 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -9802,16 +9760,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/hull.js": { "version": "0.2.10", "resolved": "https://registry.npmjs.org/hull.js/-/hull.js-0.2.10.tgz", "integrity": "sha512-UO3W30HxhWgeSpNKCdXt00xkwjRTGmhQaoZNP8ll509Nl+DP9juXE3wRGizihuop08FSB4xtAWIbWSe+RxEoog==", - "deprecated": "This package is not maintained anymore on npmjs.com, please use GitHub URL to fetch the latest version. See the package homepage for instructions.", - "dev": true, - "license": "BSD" + "dev": true }, "node_modules/husky": { "version": "9.1.7", @@ -9833,7 +9788,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -9859,22 +9813,19 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/ify-loader": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/ify-loader/-/ify-loader-1.0.4.tgz", "integrity": "sha512-fzWOWwsTZH3c2GPNJy1dndN5lk+oyXGPbg9YrHv/UwC/SmlxNEUAst6evF1H9ySGbezgBA42YGLSr1WzAwgx9w==", "dev": true, - "license": "MIT", "dependencies": { "bl": "^1.0.0", "findup": "^0.1.5", @@ -9886,11 +9837,10 @@ } }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -9898,8 +9848,7 @@ "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" }, "node_modules/immutable": { "version": "3.8.2", @@ -9914,7 +9863,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -9931,7 +9879,6 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, - "license": "MIT", "dependencies": { "pkg-dir": "^2.0.0", "resolve-cwd": "^2.0.0" @@ -9948,7 +9895,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^2.0.0" }, @@ -9961,7 +9907,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -9975,7 +9920,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^1.1.0" }, @@ -9988,7 +9932,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -9998,7 +9941,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^2.1.0" }, @@ -10011,7 +9953,6 @@ "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.8.0.tgz", "integrity": "sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ==", "dev": true, - "license": "MIT", "dependencies": { "loader-utils": "^1.0.2", "source-map": "^0.6.1" @@ -10025,7 +9966,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -10034,7 +9974,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -10044,7 +9983,6 @@ "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", "dev": true, - "license": "ISC", "bin": { "in-install": "in-install.js", "in-publish": "in-publish.js", @@ -10057,7 +9995,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10066,15 +10003,12 @@ "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, - "license": "ISC" + "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==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -10083,14 +10017,12 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/inquirer": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "license": "MIT", "dependencies": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -10114,7 +10046,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "license": "MIT", "engines": { "node": ">=6" } @@ -10123,7 +10054,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "license": "MIT", "engines": { "node": ">=4" } @@ -10132,7 +10062,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "license": "MIT", "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -10145,7 +10074,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "license": "MIT", "engines": { "node": ">=4" } @@ -10154,7 +10082,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0" }, @@ -10166,7 +10093,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "license": "MIT", "dependencies": { "ansi-regex": "^4.1.0" }, @@ -10179,7 +10105,6 @@ "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "dev": true, - "license": "MIT", "dependencies": { "default-gateway": "^4.2.0", "ipaddr.js": "^1.9.0" @@ -10189,14 +10114,13 @@ } }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.2", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -10209,7 +10133,6 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -10219,15 +10142,13 @@ "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/into-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==", "dev": true, - "license": "MIT", "dependencies": { "from2": "^2.1.1", "p-is-promise": "^1.1.0" @@ -10241,7 +10162,6 @@ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -10258,7 +10178,6 @@ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -10268,7 +10187,6 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.10" } @@ -10278,7 +10196,6 @@ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10288,7 +10205,6 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", "dev": true, - "license": "MIT", "dependencies": { "hasown": "^2.0.0" }, @@ -10301,7 +10217,6 @@ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -10314,18 +10229,15 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10336,7 +10248,6 @@ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -10353,7 +10264,6 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "has-bigints": "^1.0.1" @@ -10366,7 +10276,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -10379,7 +10288,6 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "call-bind": "^1.0.2", @@ -10396,15 +10304,13 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">= 0.4" @@ -10414,16 +10320,12 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, - "license": "MIT", "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10434,7 +10336,6 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", "dev": true, - "license": "MIT", "dependencies": { "hasown": "^2.0.0" }, @@ -10442,29 +10343,11 @@ "node": ">= 0.4" } }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -10480,7 +10363,6 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, - "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -10510,7 +10392,6 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, - "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4" }, @@ -10522,7 +10403,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10532,7 +10412,6 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "call-bind": "^1.0.2" @@ -10546,7 +10425,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10556,7 +10434,6 @@ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -10572,7 +10449,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -10581,15 +10457,11 @@ } }, "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "dev": true, - "license": "MIT", "optional": true, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10598,15 +10470,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-my-json-valid": { "version": "2.20.6", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", "dev": true, - "license": "MIT", "dependencies": { "generate-function": "^2.0.0", "generate-object-property": "^1.1.0", @@ -10619,15 +10489,13 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">= 0.4" @@ -10650,7 +10518,6 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -10667,7 +10534,6 @@ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10677,7 +10543,6 @@ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -10687,7 +10552,6 @@ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "dev": true, - "license": "MIT", "dependencies": { "is-path-inside": "^2.1.0" }, @@ -10700,7 +10564,6 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "dev": true, - "license": "MIT", "dependencies": { "path-is-inside": "^1.0.2" }, @@ -10713,7 +10576,6 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -10723,7 +10585,6 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10733,7 +10594,6 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -10745,15 +10605,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -10769,45 +10627,35 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/is-retry-allowed": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", "dev": true, - "license": "MIT", "optional": true, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10818,7 +10666,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10828,7 +10675,6 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "has-tostringtag": "^1.0.0" @@ -10845,7 +10691,6 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "has-symbols": "^1.0.2" @@ -10858,14 +10703,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -10878,19 +10722,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", "dev": true, - "license": "MIT", "optional": true, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10900,7 +10739,6 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "call-bind": "^1.0.2" @@ -10910,18 +10748,14 @@ } }, "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10932,7 +10766,6 @@ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10942,29 +10775,26 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "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, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10973,15 +10803,13 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -10991,7 +10819,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "append-transform": "^2.0.0" }, @@ -11004,7 +10831,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", @@ -11020,7 +10846,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, - "license": "ISC", "dependencies": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", @@ -11037,9 +10862,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -11055,7 +10878,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -11070,17 +10892,27 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/istanbul-lib-report/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/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -11092,11 +10924,13 @@ } }, "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -11109,7 +10943,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11117,12 +10950,17 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-report/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/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -11137,17 +10975,15 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -11161,7 +10997,6 @@ "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "dev": true, - "license": "MIT", "dependencies": { "has-to-string-tag-x": "^1.2.0", "is-object": "^1.0.1" @@ -11175,7 +11010,6 @@ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "define-properties": "^1.2.1", @@ -11190,7 +11024,6 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.2.tgz", "integrity": "sha512-GHeGTmnuaHnvS+ZctRB01bfxARuu9wW83ENbuiweu07SFcVlZrJpcshSre/keGT7YGBhLHg/+rXCNSrsEHKU4Q==", "dev": true, - "license": "ISC", "dependencies": { "cliui": "^7.0.4" }, @@ -11201,21 +11034,18 @@ "node_modules/js-md5": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.7.3.tgz", - "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==", - "license": "MIT" + "integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -11228,7 +11058,6 @@ "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "xmlcreate": "^2.0.4" } @@ -11237,15 +11066,13 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/jsdoc": { "version": "3.6.6", "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.6.tgz", "integrity": "sha512-znR99e1BHeyEkSvgDDpX0sTiTu+8aQyDl9DawrkOGZTTW8hv0deIFXx87114zJ7gRaDZKVQD/4tr1ifmJp9xhQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@babel/parser": "^7.9.4", "bluebird": "^3.7.2", @@ -11274,7 +11101,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -11284,7 +11110,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -11297,7 +11122,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -11321,42 +11145,36 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "license": "MIT" + "dev": true }, "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, - "license": "MIT" + "dev": true }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" + "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==", - "license": "MIT" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", - "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.0.tgz", + "integrity": "sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "isarray": "^2.0.5", @@ -11373,29 +11191,19 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "license": "MIT" - }, - "node_modules/json-stable-stringify/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -11408,7 +11216,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -11418,7 +11225,6 @@ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", "dev": true, - "license": "Public Domain", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11428,7 +11234,6 @@ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11438,7 +11243,6 @@ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, - "license": "MIT", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -11454,7 +11258,6 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "array-includes": "^3.1.6", @@ -11471,7 +11274,6 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -11480,15 +11282,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true, - "license": "ISC" + "dev": true }, "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, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11498,7 +11298,6 @@ "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.9" } @@ -11518,7 +11317,6 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, - "license": "MIT", "dependencies": { "invert-kv": "^2.0.0" }, @@ -11531,7 +11329,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -11545,7 +11342,6 @@ "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.4.1.tgz", "integrity": "sha512-S9v19shLTigoMn3c02V7LZ4t09zxmVP3r3RbEAwuHFYeKgF+ESFJxoQ0PMFKW4XdgQhcjVBEwDoopG6WROq/gw==", "dev": true, - "license": "ISC", "dependencies": { "async-hook-domain": "^2.0.4", "bind-obj-methods": "^3.0.0", @@ -11572,7 +11368,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", "dependencies": { "immediate": "~3.0.5" } @@ -11582,19 +11377,26 @@ "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-0.3.0.tgz", "integrity": "sha512-zt8pzlM3oq4moDN8U5mP1SbZ44yKV6dXCu44Ez6iTXmxUl8/jRFWeho2SDqL5YDBv0TBKPgU/XGovZwnXAKlOQ==", "dev": true, - "license": "MIT", "dependencies": { "base64-js": "0.0.8", "brfs": "^1.3.0", "unicode-trie": "^0.3.0" } }, + "node_modules/linebreak/node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", "dev": true, - "license": "MIT", "dependencies": { "uc.micro": "^1.0.1" } @@ -11604,7 +11406,6 @@ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.3.0 <5.0.0 || >=5.10" } @@ -11613,7 +11414,6 @@ "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==", - "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -11627,7 +11427,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -11640,7 +11439,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -11654,43 +11452,37 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.defaultsdeep": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/loglevel": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", - "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6.0" }, @@ -11702,15 +11494,13 @@ "node_modules/lookup-closest-locale": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz", - "integrity": "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==", - "license": "MIT" + "integrity": "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -11724,7 +11514,6 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11734,7 +11523,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -11744,7 +11532,6 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", "dev": true, - "license": "MIT", "dependencies": { "vlq": "^0.2.2" } @@ -11754,7 +11541,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -11770,7 +11556,6 @@ "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, - "license": "MIT", "dependencies": { "p-defer": "^1.0.0" }, @@ -11783,7 +11568,6 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11793,7 +11577,6 @@ "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==", "dev": true, - "license": "MIT", "dependencies": { "once": "~1.3.0" } @@ -11803,7 +11586,6 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", "dev": true, - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -11813,7 +11595,6 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", "dev": true, - "license": "MIT", "dependencies": { "object-visit": "^1.0.0" }, @@ -11826,7 +11607,6 @@ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "entities": "~2.0.0", @@ -11843,7 +11623,6 @@ "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", "dev": true, - "license": "Unlicense", "peerDependencies": { "markdown-it": "*" } @@ -11853,7 +11632,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -11862,15 +11640,13 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/marked": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/marked/-/marked-0.8.2.tgz", "integrity": "sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==", "dev": true, - "license": "MIT", "bin": { "marked": "bin/marked" }, @@ -11878,12 +11654,21 @@ "node": ">= 8.16.2" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, - "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -11894,8 +11679,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/media-typer": { "version": "0.3.0", @@ -11912,7 +11696,6 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, - "license": "MIT", "dependencies": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^2.0.0", @@ -11927,7 +11710,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -11937,7 +11719,6 @@ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -11947,12 +11728,47 @@ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", "dev": true, - "license": "MIT", "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" } }, + "node_modules/memory-fs/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/memory-fs/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/memory-fs/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/memory-fs/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -11968,7 +11784,6 @@ "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", "dev": true, - "license": "MIT", "dependencies": { "source-map": "^0.5.6" } @@ -11978,7 +11793,6 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -11986,15 +11800,13 @@ "node_modules/microee": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/microee/-/microee-0.0.6.tgz", - "integrity": "sha512-/LdL3jiBWDJ3oQIRLgRhfeCZNE3patM1LiwCC124+/HHn10sI/G2OAyiMfTNzH5oYWoZBk0tRZADAUOv+0Wt0A==", - "license": "BSD" + "integrity": "sha512-/LdL3jiBWDJ3oQIRLgRhfeCZNE3patM1LiwCC124+/HHn10sI/G2OAyiMfTNzH5oYWoZBk0tRZADAUOv+0Wt0A==" }, "node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, - "license": "MIT", "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -12019,7 +11831,6 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, - "license": "MIT", "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -12041,7 +11852,6 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, - "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -12054,7 +11864,6 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, - "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -12070,7 +11879,6 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, - "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -12083,7 +11891,6 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12093,7 +11900,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, - "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -12106,7 +11912,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, - "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -12119,7 +11924,6 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -12133,7 +11937,6 @@ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, - "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -12146,8 +11949,7 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/mime": { "version": "1.6.0", @@ -12163,11 +11965,10 @@ } }, "node_modules/mime-db": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", - "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12177,7 +11978,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -12185,21 +11985,10 @@ "node": ">= 0.6" } }, - "node_modules/mime-types/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, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "license": "MIT", "engines": { "node": ">=4" } @@ -12209,7 +11998,6 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -12227,7 +12015,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/minilog/-/minilog-3.1.0.tgz", "integrity": "sha512-Xfm4jWjWzSAduvEWtuZX/8TMkxfJlCfH7XvikCZe3ptojYTBq1eoEs3rh9/3LNLOckUP86m+8l8+Iw5NU/pBww==", - "license": "MIT", "dependencies": { "microee": "0.0.6" } @@ -12236,21 +12023,18 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12262,7 +12046,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -12272,7 +12055,6 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -12284,15 +12066,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/mississippi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -12314,7 +12094,6 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, - "license": "MIT", "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -12327,7 +12106,6 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -12339,15 +12117,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", "integrity": "sha512-PbNHr7Y/9Y/2P5pKFv5XOGBfNQqZ+fdiHWcuf7swLACN5ZW5LU7J5tMU8LSBjpluAxAxKYGD9nnaIbdRy9+m1w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/mocha": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", "dev": true, - "license": "MIT", "dependencies": { "browser-stdout": "1.3.0", "commander": "2.11.0", @@ -12372,15 +12148,13 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/mocha/node_modules/debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -12390,7 +12164,6 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -12399,9 +12172,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12419,7 +12190,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12428,8 +12198,7 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/mocha/node_modules/mkdirp": { "version": "0.5.1", @@ -12437,7 +12206,6 @@ "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", "dev": true, - "license": "MIT", "dependencies": { "minimist": "0.0.8" }, @@ -12449,15 +12217,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/mocha/node_modules/supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^2.0.0" }, @@ -12469,9 +12235,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", - "deprecated": "This package is no longer supported.", "dev": true, - "license": "ISC", "dependencies": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -12482,17 +12246,15 @@ } }, "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, - "license": "MIT", "dependencies": { "dns-packet": "^1.3.1", "thunky": "^1.0.2" @@ -12505,15 +12267,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/multipipe": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.3.1.tgz", "integrity": "sha512-ZUcepNdMeKBRn/ksm2XTxFnhBaqnBJSZNqwajmiem6b7Rp3fNAAq+twYn3kqw9YMY7HJuc7I7OObX9cMgB1ANg==", "dev": true, - "license": "MIT", "dependencies": { "duplexer2": "^0.1.2" } @@ -12521,15 +12281,13 @@ "node_modules/mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "license": "ISC" + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" }, "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/nanomatch": { @@ -12537,7 +12295,6 @@ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, - "license": "MIT", "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -12558,15 +12315,13 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "license": "MIT" + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12575,28 +12330,24 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "license": "MIT" + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -12617,7 +12368,6 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.0.0" } @@ -12627,7 +12377,6 @@ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, - "license": "MIT", "dependencies": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", @@ -12654,72 +12403,82 @@ "vm-browserify": "^1.0.1" } }, - "node_modules/node-libs-browser/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "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" - } - ], - "license": "MIT" - }, "node_modules/node-libs-browser/node_modules/buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "dev": true, - "license": "MIT", "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" } }, + "node_modules/node-libs-browser/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, "node_modules/node-libs-browser/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" + "dev": true }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "node_modules/node-libs-browser/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "node_modules/node-libs-browser/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/node-libs-browser/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "license": "MIT" + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -12732,7 +12491,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } @@ -12741,7 +12499,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12751,7 +12508,6 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "dev": true, - "license": "MIT", "dependencies": { "prepend-http": "^2.0.0", "query-string": "^5.0.1", @@ -12765,15 +12521,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^2.0.0" }, @@ -12786,7 +12540,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -12796,7 +12549,6 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12806,7 +12558,6 @@ "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", @@ -12843,60 +12594,11 @@ "node": ">=8.9" } }, - "node_modules/nyc/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/nyc/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, "node_modules/nyc/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, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -12910,7 +12612,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -12923,7 +12624,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -12939,7 +12639,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -12952,7 +12651,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -12962,7 +12660,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -12971,9 +12668,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -12984,64 +12679,11 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "*" } @@ -13051,7 +12693,6 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13061,7 +12702,6 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", "dev": true, - "license": "MIT", "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -13076,7 +12716,6 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, - "license": "MIT", "dependencies": { "is-descriptor": "^0.1.0" }, @@ -13089,7 +12728,6 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dev": true, - "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -13103,7 +12741,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, - "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -13112,9 +12749,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -13125,14 +12762,13 @@ } }, "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -13146,7 +12782,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -13156,7 +12791,6 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "dev": true, - "license": "MIT", "dependencies": { "isobject": "^3.0.0" }, @@ -13169,7 +12803,6 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -13184,33 +12817,30 @@ } }, "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -13219,12 +12849,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dev": true, + "optional": true, + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, - "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -13233,16 +12876,15 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -13255,8 +12897,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/on-finished": { "version": "2.4.1", @@ -13276,7 +12917,6 @@ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -13285,7 +12925,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", "dependencies": { "wrappy": "1" } @@ -13294,7 +12933,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "license": "MIT", "dependencies": { "mimic-fn": "^1.0.0" }, @@ -13337,7 +12975,6 @@ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true, - "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } @@ -13347,7 +12984,6 @@ "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "dev": true, - "license": "MIT", "dependencies": { "is-wsl": "^1.1.0" }, @@ -13356,18 +12992,17 @@ } }, "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, - "license": "MIT", "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -13377,15 +13012,13 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13395,7 +13028,6 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, - "license": "MIT", "dependencies": { "execa": "^1.0.0", "lcid": "^2.0.0", @@ -13409,7 +13041,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13418,15 +13049,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", "integrity": "sha512-NfZr5+Tdf6MB8UI9GLvKRs4cXY8/yB0w3xtt84xFdWy8hkGjn+JFc60VhzS/hFRfbyxFcGYMTjnF4Me+RbbqrA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/own-or-env": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.2.tgz", "integrity": "sha512-NQ7v0fliWtK7Lkb+WdFqe6ky9XAzYmlkXthQrBbzlYbmFKoAYbDDcwmOm6q8kOuwSRXW8bdL5ORksploUJmWgw==", "dev": true, - "license": "ISC", "dependencies": { "own-or": "^1.0.0" } @@ -13436,7 +13065,6 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13446,7 +13074,6 @@ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13456,7 +13083,6 @@ "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", "dev": true, - "license": "MIT", "dependencies": { "p-timeout": "^2.0.1" }, @@ -13469,7 +13095,6 @@ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13479,7 +13104,6 @@ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13489,7 +13113,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^1.0.0" }, @@ -13502,7 +13125,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -13518,7 +13140,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -13534,7 +13155,6 @@ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -13547,7 +13167,6 @@ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "dev": true, - "license": "MIT", "dependencies": { "retry": "^0.12.0" }, @@ -13560,7 +13179,6 @@ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", "dev": true, - "license": "MIT", "dependencies": { "p-finally": "^1.0.0" }, @@ -13573,7 +13191,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13583,7 +13200,6 @@ "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, - "license": "ISC", "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", @@ -13597,26 +13213,59 @@ "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "node_modules/parallel-transform": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, - "license": "MIT", "dependencies": { "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } }, + "node_modules/parallel-transform/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/parallel-transform/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/parallel-transform/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/parallel-transform/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -13625,21 +13274,16 @@ } }, "node_modules/parse-asn1": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", - "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, - "license": "ISC", "dependencies": { - "asn1.js": "^4.10.1", - "browserify-aes": "^1.2.0", - "evp_bytestokey": "^1.0.3", - "hash-base": "~3.0", - "pbkdf2": "^3.1.2", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.10" + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "node_modules/parseurl": { @@ -13647,7 +13291,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -13657,7 +13300,6 @@ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13859,22 +13501,19 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true, - "license": "MIT" + "dev": true }, "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, - "license": "MIT", "engines": { "node": ">=8" } @@ -13883,7 +13522,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13891,15 +13529,13 @@ "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "license": "(WTFPL OR MIT)" + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, "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, - "license": "MIT", "engines": { "node": ">=8" } @@ -13908,13 +13544,12 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true, "license": "MIT" }, @@ -13923,7 +13558,6 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^3.0.0" }, @@ -13936,7 +13570,6 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, - "license": "MIT", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -13952,27 +13585,24 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "license": "ISC" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -13985,7 +13615,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -13995,7 +13624,6 @@ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14005,7 +13633,6 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, - "license": "MIT", "dependencies": { "pinkie": "^2.0.0" }, @@ -14018,7 +13645,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -14031,7 +13657,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -14045,7 +13670,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -14058,7 +13682,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -14074,7 +13697,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -14087,7 +13709,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -14096,15 +13717,13 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", "integrity": "sha512-TH+BeeL6Ct98C7as35JbZLf8lgsRzlNJb5gklRIGHKaPkGl1esOKBc5ALUMd+q08Sr6tiEKM+Icbsxg5vuhMKQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/pngjs": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.3.3.tgz", "integrity": "sha512-1n3Z4p3IOxArEs1VRXnZ/RXdfEniAUS9jb68g58FIXMNkPJeZd+Qh4Uq7/e0LVxAQGos1eIUrqrt4FpjdnEd+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -14114,7 +13733,6 @@ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, - "license": "MIT", "dependencies": { "async": "^2.6.4", "debug": "^3.2.7", @@ -14129,7 +13747,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -14139,28 +13756,15 @@ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -14170,7 +13774,6 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -14180,7 +13783,6 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -14188,15 +13790,13 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, - "license": "MIT", "dependencies": { "fromentries": "^1.2.0" }, @@ -14205,10 +13805,10 @@ } }, "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "license": "MIT", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -14217,15 +13817,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "loose-envify": "^1.4.0", @@ -14238,7 +13836,6 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, - "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -14251,29 +13848,25 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, - "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -14287,15 +13880,13 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, - "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -14306,7 +13897,6 @@ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, - "license": "MIT", "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -14317,7 +13907,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", "engines": { "node": ">=6" } @@ -14327,7 +13916,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.6" } @@ -14337,7 +13925,6 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, - "license": "MIT", "dependencies": { "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", @@ -14360,8 +13947,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/queue-microtask": { "version": "1.2.3", @@ -14381,15 +13967,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/quote-stream": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", "dev": true, - "license": "MIT", "dependencies": { "buffer-equal": "0.0.1", "minimist": "^1.1.3", @@ -14404,7 +13988,6 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -14414,7 +13997,6 @@ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, - "license": "MIT", "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -14425,7 +14007,6 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -14467,16 +14048,13 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, - "license": "MIT", "optional": true }, "node_modules/read-package-json": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", - "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.1", "json-parse-even-better-errors": "^2.3.0", @@ -14485,31 +14063,22 @@ } }, "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -14522,7 +14091,6 @@ "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", "integrity": "sha512-8/td4MmwUB6PkZUbV25uKz7dfrmjYWxsW8DVfibWdlHRk/l/DfHKn4pU+dfcoGLFgWOdyGCzINRQD7jn+Bv+/g==", "dev": true, - "license": "MIT", "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -14534,7 +14102,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, - "license": "MIT", "dependencies": { "number-is-nan": "^1.0.0" }, @@ -14546,8 +14113,7 @@ "version": "0.0.5", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", "integrity": "sha512-EbrziT4s8cWPmzr47eYVW3wimS4HsvlnV5ri1xw1aR6JQo/OrJX5rkl32K/QQHdxeabJETtfeaROGhd8W7uBgg==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/rechoir": { "version": "0.6.2", @@ -14562,18 +14128,16 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, @@ -14588,15 +14152,13 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, - "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -14608,15 +14170,13 @@ "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/regenerator-transform": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } @@ -14626,7 +14186,6 @@ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, - "license": "MIT", "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -14636,16 +14195,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -14668,7 +14225,6 @@ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", @@ -14686,7 +14242,6 @@ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "jsesc": "~0.5.0" }, @@ -14708,7 +14263,6 @@ "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, - "license": "ISC", "dependencies": { "es6-error": "^4.0.1" }, @@ -14720,15 +14274,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/repeat-element": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14738,7 +14290,6 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10" } @@ -14749,7 +14300,6 @@ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dev": true, - "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -14782,7 +14332,6 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, - "license": "MIT", "bin": { "uuid": "bin/uuid" } @@ -14791,7 +14340,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14799,15 +14347,13 @@ "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "license": "ISC" + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "node_modules/require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w==", "dev": true, - "license": "MIT", "dependencies": { "caller-path": "^0.1.0", "resolve-from": "^1.0.0" @@ -14821,7 +14367,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", "integrity": "sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14830,15 +14375,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/requizzle": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", "dev": true, - "license": "MIT", "dependencies": { "lodash": "^4.17.21" } @@ -14848,7 +14391,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, - "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -14866,7 +14408,6 @@ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", "dev": true, - "license": "MIT", "dependencies": { "resolve-from": "^3.0.0" }, @@ -14879,7 +14420,6 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -14888,7 +14428,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "license": "MIT", "engines": { "node": ">=4" } @@ -14898,15 +14437,13 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "dev": true, - "license": "MIT", "dependencies": { "lowercase-keys": "^1.0.0" } @@ -14915,7 +14452,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "license": "MIT", "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -14929,7 +14465,6 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12" } @@ -14939,7 +14474,6 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -14949,7 +14483,6 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -14959,9 +14492,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -14974,7 +14505,6 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, - "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -14984,7 +14514,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -15008,7 +14537,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -15018,7 +14546,6 @@ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", "dev": true, - "license": "ISC", "dependencies": { "aproba": "^1.1.1" } @@ -15033,7 +14560,6 @@ "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "license": "Apache-2.0", "dependencies": { "tslib": "^1.9.0" }, @@ -15042,15 +14568,14 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -15061,19 +14586,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT", - "optional": true - }, "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", @@ -15087,34 +14603,28 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", "dev": true, - "license": "MIT", "dependencies": { "ret": "~0.1.10" } }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", "is-regex": "^1.1.4" }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -15122,15 +14632,13 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "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, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -15149,7 +14657,6 @@ "resolved": "https://registry.npmjs.org/scratch-audio/-/scratch-audio-0.1.0-prerelease.20231221012053.tgz", "integrity": "sha512-NtleZZPFHcmDtybyNpGjgINTCmfqJHSPiRBn5Crvk8kqKPbYSr1vnFRJlO1JwjTHi+xK0BJscQoxW0ad3cquUw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "audio-context": "1.0.1", "minilog": "^3.0.1", @@ -15158,7 +14665,7 @@ }, "node_modules/scratch-blocks": { "version": "0.1.0", - "resolved": "git+ssh://git@github.com/MistWarp/scratch-blocks.git#df9e37c0d037e7d17da027fbe64498cc8e63ec1c", + "resolved": "git+ssh://git@github.com/MistWarp/scratch-blocks.git#20a02fcd88cc53a759b2e614a3c1597c25b56905", "dev": true, "license": "GPL-3.0", "dependencies": { @@ -15171,7 +14678,6 @@ "resolved": "https://registry.npmjs.org/scratch-l10n/-/scratch-l10n-3.16.20231222031921.tgz", "integrity": "sha512-nKm6cc2cMh1lGRLuj3ItPJNU0YW6RNht0CP/d82hRPEdyOlsfFqMbM+6+1rrzivjd2Cg3HZM/VqXR1BsH96QNA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/cli": "^7.1.2", "@babel/core": "^7.1.2", @@ -15187,12 +14693,12 @@ }, "node_modules/scratch-parser": { "version": "0.0.0-development", - "resolved": "git+ssh://git@github.com/TurboWarp/scratch-parser.git#9911fe8e6b5aed34ea19aff5490c3948d1523fc5", + "resolved": "git+ssh://git@github.com/TurboWarp/scratch-parser.git#fb65ba09d78ab6a0d19ce908d64b72d1a122312f", "license": "MPL-2.0", "dependencies": { "@turbowarp/json": "^0.1.1", "@turbowarp/jszip": "^3.11.0", - "@turbowarp/sb3fix": "^0.3.0", + "@turbowarp/sb3fix": "^0.5.0", "ajv": "6.3.0", "pify": "4.0.1" }, @@ -15204,7 +14710,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.3.0.tgz", "integrity": "sha512-6TQywaGYtRub2fqHkSXfVANlhfja2nbF33wCCHnt3aQstOrtd9jsQGiRUTIOlkEqcxpzRd2akfnqvBBPmLxs8g==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^1.0.0", "fast-json-stable-stringify": "^2.0.0", @@ -15214,20 +14719,17 @@ "node_modules/scratch-parser/node_modules/fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==", - "license": "MIT" + "integrity": "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==" }, "node_modules/scratch-parser/node_modules/json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==", - "license": "MIT" + "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==" }, "node_modules/scratch-parser/node_modules/pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", "engines": { "node": ">=6" } @@ -15237,7 +14739,6 @@ "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-0.1.0-prerelease.20231220210403.tgz", "integrity": "sha512-5o3CGdYod+rqidWHcNv3WO6Jr0qVDmQ4SFtupV1hLnwp5N9jcCPU7m+5Hva1IToixthanT1Z4ohPIAGYYkgp8w==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", @@ -15255,7 +14756,7 @@ }, "node_modules/scratch-render-fonts": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/TurboWarp/scratch-render-fonts.git#7b6768fc6dfef6b343a06f992587b74807043961", + "resolved": "git+ssh://git@github.com/TurboWarp/scratch-render-fonts.git#6be162025085d738317b40a01644cf8dcbcee023", "dev": true, "dependencies": { "base64-loader": "1.0.0" @@ -15265,15 +14766,13 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/scratch-render/node_modules/schema-utils": { "version": "0.4.7", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.1.0", "ajv-keywords": "^3.1.0" @@ -15287,7 +14786,6 @@ "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-1.3.6.tgz", "integrity": "sha512-L/7z7SB7cGANsgjyiE+qZNaPEqFHK1yPbNomizkgN3WHGcKRogLvmheR57kOxHNpQzodUTbG+pVVH6fR2ZY1Sg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "arraybuffer-loader": "^1.0.3", "base64-js": "1.3.0", @@ -15302,7 +14800,6 @@ "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", "dev": true, - "license": "MIT", "dependencies": { "loader-utils": "^1.0.0", "schema-utils": "^0.4.0" @@ -15318,7 +14815,6 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/scratch-sb1-converter/-/scratch-sb1-converter-0.2.7.tgz", "integrity": "sha512-MF1NzmRLbgCiq7wiSTuk2C9rQC8uM5Wj7SaYsn1SEMWNK9rtK0uc3LSm8FnEt14QS/1Icx2YgMsUPKR0HaPDdQ==", - "license": "BSD-3-Clause", "dependencies": { "js-md5": "0.7.3", "minilog": "3.1.0", @@ -15330,7 +14826,6 @@ "resolved": "https://registry.npmjs.org/scratch-storage/-/scratch-storage-2.3.1.tgz", "integrity": "sha512-kBxJLFGQsimP35YHig+8op5V9+FLfO7mXbhSLj4712dyHTXvyMKYY8GAf7KT283kQrUpDApehJU4Jx5PXSjLXQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "7.21.0", "arraybuffer-loader": "^1.0.3", @@ -15347,7 +14842,6 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dev": true, - "license": "MIT", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -15359,22 +14853,19 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/scratch-storage/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/scratch-storage/node_modules/schema-utils": { "version": "0.4.7", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.1.0", "ajv-keywords": "^3.1.0" @@ -15388,7 +14879,6 @@ "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", "dev": true, - "license": "MIT", "dependencies": { "loader-utils": "^1.0.0", "schema-utils": "^0.4.0" @@ -15405,7 +14895,6 @@ "resolved": "https://registry.npmjs.org/scratch-svg-renderer/-/scratch-svg-renderer-0.2.0.tgz", "integrity": "sha512-Q0ahFFRt8ApvR7uS7DHiKOx8neQJAd0zpVS6NpwITtWKj5Aet8KwrKKkEqr9s7YCKMtiLWwL+LarXIcO94qxRg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "base64-js": "1.2.1", "base64-loader": "1.0.0", @@ -15418,17 +14907,10 @@ "scratch-render-fonts": "^1.0.0-prerelease" } }, - "node_modules/scratch-svg-renderer/node_modules/base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", - "dev": true, - "license": "MIT" - }, "node_modules/scratch-translate-extension-languages": { - "version": "0.0.20191118205314", - "resolved": "https://registry.npmjs.org/scratch-translate-extension-languages/-/scratch-translate-extension-languages-0.0.20191118205314.tgz", - "integrity": "sha512-r0lvpgQjPMjbhI2wROrgoXzBhCvWJdkbAqJMfl2CdNqrwBpUXqLvNNtI3VtNLPJAcp9VfxEylkU9lVZ0gvU46Q==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/scratch-translate-extension-languages/-/scratch-translate-extension-languages-1.0.7.tgz", + "integrity": "sha512-6+bQU9iVYv23T8J0SjpV6MTugm0y8myh/4DPgu1BGfccysdkaWzu3MkNGQyQRUlbqAiW9wM7ctfv3USPEkzTgg==", "license": "BSD-3-Clause" }, "node_modules/script-loader": { @@ -15436,7 +14918,6 @@ "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz", "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==", "dev": true, - "license": "MIT", "dependencies": { "raw-loader": "~0.5.1" } @@ -15446,7 +14927,6 @@ "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", "dev": true, - "license": "MIT", "dependencies": { "commander": "^2.8.1" }, @@ -15459,15 +14939,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/selfsigned": { "version": "1.10.14", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", "dev": true, - "license": "MIT", "dependencies": { "node-forge": "^0.10.0" } @@ -15477,7 +14955,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -15534,19 +15011,24 @@ "node": ">= 0.8" } }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "node_modules/serialize-javascript": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -15565,7 +15047,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -15575,7 +15056,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15585,7 +15065,6 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, - "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -15600,29 +15079,25 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15646,38 +15121,32 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", "dev": true, - "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "has-property-descriptors": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", "dev": true, - "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", + "define-data-property": "^1.0.1", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" + "has-property-descriptors": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15688,7 +15157,6 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, - "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -15704,7 +15172,6 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, - "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -15717,7 +15184,6 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -15725,8 +15191,7 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -15740,7 +15205,6 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, - "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -15753,15 +15217,13 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==", - "dev": true, - "license": "MIT" + "dev": true }, "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, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -15774,7 +15236,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -15784,7 +15245,6 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", "integrity": "sha512-/YF5Uk8hcwi7ima04ppkbA4RaRMdPMBfwAvAf8sufYOxsJRtbdoBsT8vGvlb+799BrlGdYrd+oczIA2eN2JdWA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -15803,7 +15263,6 @@ "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", "dev": true, - "license": "MIT", "dependencies": { "should-equal": "^2.0.0", "should-format": "^3.0.3", @@ -15817,7 +15276,6 @@ "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", "dev": true, - "license": "MIT", "dependencies": { "should-type": "^1.4.0" } @@ -15827,7 +15285,6 @@ "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", "dev": true, - "license": "MIT", "dependencies": { "should-type": "^1.3.0", "should-type-adaptors": "^1.0.1" @@ -15837,15 +15294,13 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/should-type-adaptors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", "dev": true, - "license": "MIT", "dependencies": { "should-type": "^1.3.0", "should-util": "^1.0.0" @@ -15855,20 +15310,76 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -15880,40 +15391,24 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "license": "MIT", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha512-up04hB2hR92PgjpyU3y/eg91yIBILyjVY26NvvciY3EVVPjybkMszMpXQ9QAkcS3I5rtJBDLoTxxg+qvW8c7rw==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, "node_modules/snapdragon": { @@ -15921,7 +15416,6 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, - "license": "MIT", "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", @@ -15941,7 +15435,6 @@ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, - "license": "MIT", "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -15956,7 +15449,6 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, - "license": "MIT", "dependencies": { "is-descriptor": "^1.0.0" }, @@ -15969,7 +15461,6 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, - "license": "MIT", "dependencies": { "kind-of": "^3.2.0" }, @@ -15982,7 +15473,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, - "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -15995,7 +15485,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -16005,7 +15494,6 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, - "license": "MIT", "dependencies": { "is-descriptor": "^0.1.0" }, @@ -16018,7 +15506,6 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, - "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -16031,7 +15518,6 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dev": true, - "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -16045,7 +15531,6 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -16054,15 +15539,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, - "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -16074,7 +15557,6 @@ "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7", "eventsource": "^2.0.2", @@ -16094,7 +15576,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -16104,7 +15585,6 @@ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", "dev": true, - "license": "MIT", "dependencies": { "is-plain-obj": "^1.0.0" }, @@ -16117,7 +15597,6 @@ "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", "dev": true, - "license": "MIT", "dependencies": { "sort-keys": "^1.0.0" }, @@ -16130,7 +15609,6 @@ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", "dev": true, - "license": "MIT", "dependencies": { "is-plain-obj": "^1.0.0" }, @@ -16142,15 +15620,13 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -16161,7 +15637,6 @@ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, - "license": "MIT", "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -16175,7 +15650,6 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -16186,7 +15660,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -16196,15 +15669,13 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", @@ -16221,9 +15692,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -16239,43 +15708,38 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", - "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", - "dev": true, - "license": "CC0-1.0" + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -16292,7 +15756,6 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -16302,27 +15765,11 @@ "wbuf": "^1.7.3" } }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, - "license": "MIT", "dependencies": { "extend-shallow": "^3.0.0" }, @@ -16333,15 +15780,13 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "license": "BSD-3-Clause" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/sshpk": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, - "license": "MIT", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -16367,7 +15812,6 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "dev": true, - "license": "ISC", "dependencies": { "safe-buffer": "^5.1.1" } @@ -16377,7 +15821,6 @@ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -16390,7 +15833,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -16399,15 +15841,13 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/startaudiocontext/-/startaudiocontext-1.2.1.tgz", "integrity": "sha512-ooOQhOAoCwzMIRwWd9j7xF8kAMo1Wv7Zfw+q6dWDW5gxJUKx15HJXWDg89GMDqfdle9xsqPv+uioneX+bI643g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/static-eval": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", "dev": true, - "license": "MIT", "dependencies": { "escodegen": "^2.1.0" } @@ -16417,7 +15857,6 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -16439,7 +15878,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -16453,7 +15891,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" @@ -16464,7 +15901,6 @@ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "dev": true, - "license": "MIT", "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -16478,7 +15914,6 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, - "license": "MIT", "dependencies": { "is-descriptor": "^0.1.0" }, @@ -16491,7 +15926,6 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dev": true, - "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -16505,7 +15939,6 @@ "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", "dev": true, - "license": "MIT", "dependencies": { "concat-stream": "~1.6.0", "convert-source-map": "^1.5.1", @@ -16523,19 +15956,53 @@ "through2": "~2.0.3" } }, + "node_modules/static-module/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, "node_modules/static-module/node_modules/object-inspect": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==", + "dev": true + }, + "node_modules/static-module/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/static-module/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/static-module/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } }, "node_modules/stats.js": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/statuses": { "version": "2.0.1", @@ -16552,29 +16019,62 @@ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" } }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "node_modules/stream-browserify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "node_modules/stream-browserify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/stream-browserify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, - "license": "MIT", "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", @@ -16583,44 +16083,70 @@ "xtend": "^4.0.0" } }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "node_modules/stream-http/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-http/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/stream-http/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true }, "node_modules/strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16631,57 +16157,36 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", + "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -16691,35 +16196,30 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16730,7 +16230,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16743,7 +16242,6 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -16753,7 +16251,6 @@ "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", "dev": true, - "license": "MIT", "dependencies": { "is-natural-number": "^4.0.1" } @@ -16763,7 +16260,6 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -16773,7 +16269,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -16786,7 +16281,6 @@ "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.2" }, @@ -16798,7 +16292,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -16811,7 +16304,6 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -16820,68 +16312,134 @@ } }, "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "license": "BSD-3-Clause", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha512-RZuzIOtzFbprLCE0AXhkI0Xi42ZJLZhCC+qkwuMLf/Vjz3maWpA8gz1qMdbmNoI9cOROT2Am/DxeRyXenrL11g==", + "dev": true, "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", + "slice-ansi": "0.0.4", + "string-width": "^2.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha512-I/bSHSNEcFFqXLf91nchoNB9D1Kie3QKcWdchYUaoIg1+1bdWDkdfdlvdIOJbi9U8xR0y+MWc5D+won9v95WlQ==", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "node_modules/table/node_modules/ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha512-vuBv+fm2s6cqUyey2A7qYcvsik+GMDJsw8BARP2sDE76cqmaZVarsvHf7Vx6VJ0Xk8gLl+u3MoAPf6gKzJefeA==", + "dev": true, + "peerDependencies": { + "ajv": ">=4.10.0" } }, "node_modules/table/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "license": "MIT", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "license": "MIT" + "node_modules/table/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/table/node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "license": "MIT", + "dev": true, "engines": { "node": ">=4" } }, "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "license": "MIT", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "strip-ansi": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "license": "MIT", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" + } + }, + "node_modules/table/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" } }, "node_modules/taffydb": { @@ -16902,7 +16460,6 @@ "react" ], "dev": true, - "license": "ISC", "dependencies": { "@isaacs/import-jsx": "^4.0.1", "@types/react": "^17", @@ -16966,7 +16523,6 @@ "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.4.tgz", "integrity": "sha512-J+YMO8B7lq1O6Zxd/jeuG27vJ+Y4tLiRMKPSb7KR6FVh86k3Rq1TwYc2GKPyIjCbzzdMdReh3Vfz9L5cg1Z2Bw==", "dev": true, - "license": "ISC", "dependencies": { "color-support": "^1.1.0", "debug": "^4.1.1", @@ -16989,7 +16545,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -16999,7 +16554,6 @@ "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-11.0.2.tgz", "integrity": "sha512-6qGlC956rcORw+fg7Fv1iCRAY8/bU9UabUAhs3mXRH6eRmVZcNPLheSXCYaVaYeSwx5xa/1HXZb1537YSvwDZg==", "dev": true, - "license": "MIT", "dependencies": { "events-to-array": "^1.0.1", "minipass": "^3.1.6", @@ -17017,7 +16571,6 @@ "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.2.tgz", "integrity": "sha512-GegASpuqBnRNdT1U+yuUPZ8rEU64pL35WPBpCISWwff4dErS2/438barz7WFJl4Nzh3Y05tfPidZnH+GaV1wMg==", "dev": true, - "license": "ISC", "dependencies": { "yaml": "^1.10.2" } @@ -18244,7 +17797,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -18906,7 +18458,6 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -18916,7 +18467,6 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dev": true, - "license": "MIT", "dependencies": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -18930,12 +18480,47 @@ "node": ">= 0.8.0" } }, + "node_modules/tar-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/tcompare": { "version": "5.0.7", "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.7.tgz", "integrity": "sha512-d9iddt6YYGgyxJw5bjsN7UJUO1kGOtjSlNy/4PoGYAjQS5pAT/hzIoLf1bZCw+uUxRmZJh7Yy1aA7xKVRT9B4w==", "dev": true, - "license": "ISC", "dependencies": { "diff": "^4.0.2" }, @@ -18948,7 +18533,6 @@ "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "commander": "^2.20.0", "source-map": "~0.6.1", @@ -18990,7 +18574,6 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, - "license": "ISC", "dependencies": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -19014,7 +18597,6 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -19029,7 +18611,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, @@ -19042,7 +18623,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -19056,7 +18636,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -19070,7 +18649,6 @@ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -19092,7 +18670,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -19108,7 +18685,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, @@ -19121,7 +18697,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -19131,7 +18706,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -19141,7 +18715,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -19151,7 +18724,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^3.0.0" }, @@ -19160,11 +18732,10 @@ } }, "node_modules/terser-webpack-plugin/node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, - "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -19175,7 +18746,6 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -19190,7 +18760,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } @@ -19200,7 +18769,6 @@ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -19210,7 +18778,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -19220,7 +18787,6 @@ "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, - "license": "ISC", "dependencies": { "figgy-pudding": "^3.5.1" } @@ -19230,7 +18796,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -19240,7 +18805,6 @@ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -19254,45 +18818,75 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", - "deprecated": "no longer maintained", - "license": "(Unlicense OR Apache-2.0)" + "deprecated": "no longer maintained" }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "license": "MIT" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "license": "MIT" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, - "license": "MIT", "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -19302,7 +18896,6 @@ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "dev": true, - "license": "MIT", "dependencies": { "setimmediate": "^1.0.4" }, @@ -19314,15 +18907,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/tiny-worker": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz", "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "esm": "^3.2.25" } @@ -19331,7 +18922,6 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -19343,22 +18933,19 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -19368,7 +18955,6 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", "dev": true, - "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -19381,7 +18967,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, - "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -19394,7 +18979,6 @@ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, - "license": "MIT", "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -19432,7 +19016,6 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -19445,22 +19028,19 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/transformation-matrix": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/transformation-matrix/-/transformation-matrix-1.15.0.tgz", "integrity": "sha512-808EqPQbmUD6/IMpWUXLOZcblCHf9xaiB+un0RYNNE9+6VRjoiw6Be8R32tZ0ips1PX/15tlnA2Ev4UUgg827Q==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/transifex": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/transifex/-/transifex-1.6.6.tgz", "integrity": "sha512-uHeRvhfLfZN+JdH+X0zR1jkQAbMGkgExZgcXm31CzaVVd4kq98YaPr4MCgCU0LwA7cgOuB97d2HZQ/WikOAxlg==", "dev": true, - "license": "MIT", "dependencies": { "commander": "^2.9.0", "lodash": "^4.17.1", @@ -19481,7 +19061,6 @@ "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.2" }, @@ -19494,7 +19073,6 @@ "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.1.2.tgz", "integrity": "sha512-vDPiDBC3hyP6O4JrJYMImW3nl3c03Tsj9fEXc7Qc/XKa1O7gf5ZtFfIR/E0dun9SnDHdwjna1Z2rSzYgqpxh/g==", "dev": true, - "license": "ISC", "engines": { "node": ">= 8" } @@ -19502,22 +19080,19 @@ "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -19529,29 +19104,25 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "license": "Unlicense" + "dev": true }, "node_modules/twgl.js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/twgl.js/-/twgl.js-4.4.0.tgz", "integrity": "sha512-W+uFP2DyK2dNhE38PcpituNi8CBm+YO5gY6o/IWEILT7NNDTT1wo3YcMmydwiCfUbnT7tz+EcjV7KlZLgE1PlQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "dev": true, - "license": "ISC" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -19564,7 +19135,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -19584,34 +19154,31 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -19621,19 +19188,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -19643,22 +19208,15 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.2", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "is-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -19668,15 +19226,13 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } @@ -19685,18 +19241,16 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/uglify-es": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.10.tgz", - "integrity": "sha512-rPzPisCzW68Okj1zNrfa2dR9uEm43SevDmpR6FChoZABFk9dANGnzzBMgHYUXI3609//63fnVkyQ1SQmAMyjww==", + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "commander": "~2.14.1", + "commander": "~2.13.0", "source-map": "~0.6.1" }, "bin": { @@ -19707,18 +19261,16 @@ } }, "node_modules/uglify-es/node_modules/commander": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", - "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", - "dev": true, - "license": "MIT" + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true }, "node_modules/uglify-es/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, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -19728,7 +19280,6 @@ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz", "integrity": "sha512-1VicfKhCYHLS8m1DCApqBhoulnASsEoJ/BvpUpP4zoNAPpKzdH+ghk0olGJMmwX2/jprK2j3hAHdUbczBSy2FA==", "dev": true, - "license": "MIT", "dependencies": { "cacache": "^10.0.4", "find-cache-dir": "^1.0.0", @@ -19751,7 +19302,6 @@ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", "integrity": "sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg==", "dev": true, - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^1.0.0", @@ -19766,7 +19316,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^2.0.0" }, @@ -19779,7 +19328,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -19793,7 +19341,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^3.0.0" }, @@ -19806,7 +19353,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^1.1.0" }, @@ -19819,7 +19365,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -19829,7 +19374,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^2.1.0" }, @@ -19842,7 +19386,6 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.1.0", "ajv-keywords": "^3.1.0" @@ -19856,7 +19399,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -19866,7 +19408,6 @@ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "call-bind": "^1.0.2", @@ -19883,7 +19424,6 @@ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, - "license": "MIT", "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -19893,22 +19433,19 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.10.2.tgz", "integrity": "sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true, - "license": "MIT" + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -19918,7 +19455,6 @@ "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.1.0.tgz", "integrity": "sha512-4bV582zTV9Q02RXBxSUMiuN/KHo5w4aTojuKTNT96DIKps/SIawFp7cS5Mu25VuY1AioGXrmYyzKZUzh8OqoUw==", "dev": true, - "license": "MIT", "dependencies": { "punycode": "^2.0.0" } @@ -19928,7 +19464,6 @@ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, - "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -19938,11 +19473,10 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -19952,7 +19486,6 @@ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -19962,7 +19495,6 @@ "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz", "integrity": "sha512-WgVuO0M2jDl7hVfbPgXv2LUrD81HM0bQj/bvLGiw6fJ4Zo8nNFnDrA0/hU2Te/wz6pjxCm5cxJwtLjo2eyV51Q==", "dev": true, - "license": "MIT", "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" @@ -19972,15 +19504,13 @@ "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, - "license": "MIT", "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -19996,7 +19526,6 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -20006,7 +19535,6 @@ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, - "license": "ISC", "dependencies": { "unique-slug": "^2.0.0" } @@ -20016,7 +19544,6 @@ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" } @@ -20026,7 +19553,6 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4.0.0" } @@ -20046,7 +19572,6 @@ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", "dev": true, - "license": "MIT", "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -20060,7 +19585,6 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", "dev": true, - "license": "MIT", "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -20075,7 +19599,6 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "dev": true, - "license": "MIT", "dependencies": { "isarray": "1.0.0" }, @@ -20088,26 +19611,30 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4", "yarn": "*" } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -20123,10 +19650,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -20139,7 +19665,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -20149,21 +19674,16 @@ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/url": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", - "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", "dev": true, - "license": "MIT", "dependencies": { "punycode": "^1.4.1", - "qs": "^6.12.3" - }, - "engines": { - "node": ">= 0.4" + "qs": "^6.11.2" } }, "node_modules/url-parse": { @@ -20171,7 +19691,6 @@ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, - "license": "MIT", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -20182,7 +19701,6 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "dev": true, - "license": "MIT", "dependencies": { "prepend-http": "^2.0.0" }, @@ -20195,7 +19713,6 @@ "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -20204,17 +19721,15 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/url/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" @@ -20228,7 +19743,6 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -20238,7 +19752,6 @@ "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", "integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ==", "dev": true, - "license": "MIT", "dependencies": { "os-homedir": "^1.0.0" }, @@ -20251,7 +19764,6 @@ "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, - "license": "MIT", "dependencies": { "inherits": "2.0.3" } @@ -20259,22 +19771,19 @@ "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==", - "license": "MIT" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/util/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -20283,7 +19792,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -20292,15 +19800,13 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -20311,7 +19817,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -20324,40 +19829,29 @@ "engines": [ "node >=0.6.0" ], - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT" - }, "node_modules/vlq": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/watchpack": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" @@ -20372,7 +19866,6 @@ "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "chokidar": "^2.1.8" @@ -20383,7 +19876,6 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, - "license": "ISC", "optional": true, "dependencies": { "micromatch": "^3.1.4", @@ -20395,7 +19887,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "remove-trailing-separator": "^1.0.1" @@ -20409,7 +19900,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=0.10.0" @@ -20420,7 +19910,6 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "arr-flatten": "^1.1.0", @@ -20442,8 +19931,8 @@ "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "anymatch": "^2.0.0", @@ -20467,7 +19956,6 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "is-extendable": "^0.1.0" @@ -20481,7 +19969,6 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "extend-shallow": "^2.0.1", @@ -20497,10 +19984,9 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -20518,7 +20004,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, - "license": "ISC", "optional": true, "dependencies": { "is-glob": "^3.1.0", @@ -20530,7 +20015,6 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "is-extglob": "^2.1.0" @@ -20544,7 +20028,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "binary-extensions": "^1.0.0" @@ -20558,7 +20041,6 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": ">=0.10.0" @@ -20569,7 +20051,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "kind-of": "^3.0.2" @@ -20578,18 +20059,40 @@ "node": ">=0.10.0" } }, + "node_modules/watchpack-chokidar2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "optional": true + }, "node_modules/watchpack-chokidar2/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "node_modules/watchpack-chokidar2/node_modules/readdirp": { @@ -20597,7 +20100,6 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "graceful-fs": "^4.1.11", @@ -20608,12 +20110,28 @@ "node": ">=0.10" } }, + "node_modules/watchpack-chokidar2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "node_modules/watchpack-chokidar2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "is-number": "^3.0.0", @@ -20628,7 +20146,6 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, - "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -20637,15 +20154,13 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" + "dev": true }, "node_modules/webpack": { "version": "4.47.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", "dev": true, - "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", @@ -20695,7 +20210,6 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.0.tgz", "integrity": "sha512-p5NeKDtYwjZozUWq6kGNs9w+Gtw/CPvyuXjXn2HMdz8Tie+krjEg8oAtonvIyITZdvpF7XG9xDHwscLr2c+ugQ==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^2.4.1", "cross-spawn": "^6.0.5", @@ -20724,7 +20238,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -20734,7 +20247,6 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", @@ -20742,9 +20254,9 @@ } }, "node_modules/webpack-cli/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "license": "MIT", "dependencies": { @@ -20763,7 +20275,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, @@ -20775,15 +20286,13 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/webpack-cli/node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -20793,7 +20302,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -20807,7 +20315,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -20823,7 +20330,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, @@ -20836,7 +20342,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -20846,7 +20351,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -20856,7 +20360,6 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -20865,15 +20368,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/webpack-cli/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } @@ -20883,7 +20384,6 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^1.0.0" }, @@ -20896,7 +20396,6 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -20906,7 +20405,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, - "license": "MIT", "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -20920,7 +20418,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0" }, @@ -20933,7 +20430,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -20946,7 +20442,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", "dev": true, - "license": "MIT", "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -20960,7 +20455,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -20970,7 +20464,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, - "license": "MIT", "dependencies": { "number-is-nan": "^1.0.0" }, @@ -20983,7 +20476,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, - "license": "MIT", "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -20998,7 +20490,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -21011,7 +20502,6 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^4.0.0", "decamelize": "^1.2.0", @@ -21032,7 +20522,6 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -21043,7 +20532,6 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", "dev": true, - "license": "MIT", "dependencies": { "memory-fs": "^0.4.1", "mime": "^2.4.4", @@ -21063,7 +20551,6 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -21076,7 +20563,6 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", @@ -21132,7 +20618,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -21142,7 +20627,6 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, - "license": "ISC", "dependencies": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -21153,7 +20637,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "dev": true, - "license": "MIT", "dependencies": { "remove-trailing-separator": "^1.0.1" }, @@ -21166,7 +20649,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -21176,7 +20658,6 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, - "license": "MIT", "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -21197,8 +20678,8 @@ "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", "dev": true, - "license": "MIT", "dependencies": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -21216,12 +20697,49 @@ "fsevents": "^1.2.7" } }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "node_modules/webpack-dev-server/node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, - "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -21234,7 +20752,6 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, - "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -21250,7 +20767,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, @@ -21262,10 +20778,9 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", "dev": true, "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -21283,7 +20798,6 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -21294,7 +20808,6 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.0" }, @@ -21307,7 +20820,6 @@ "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dev": true, - "license": "MIT", "dependencies": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" @@ -21324,7 +20836,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "dev": true, - "license": "MIT", "dependencies": { "binary-extensions": "^1.0.0" }, @@ -21337,17 +20848,24 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/webpack-dev-server/node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, - "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -21355,12 +20873,17 @@ "node": ">=0.10.0" } }, + "node_modules/webpack-dev-server/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, "node_modules/webpack-dev-server/node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, - "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -21373,7 +20896,6 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -21387,7 +20909,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -21403,7 +20924,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, @@ -21416,7 +20936,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -21426,7 +20945,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -21436,7 +20954,6 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^3.0.0" }, @@ -21444,12 +20961,26 @@ "node": ">=6" } }, + "node_modules/webpack-dev-server/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "node_modules/webpack-dev-server/node_modules/readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -21459,12 +20990,17 @@ "node": ">=0.10" } }, + "node_modules/webpack-dev-server/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/webpack-dev-server/node_modules/schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -21474,12 +21010,55 @@ "node": ">= 4" } }, + "node_modules/webpack-dev-server/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/webpack-dev-server/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -21492,7 +21071,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -21505,13 +21083,75 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, - "license": "MIT", "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, "node_modules/webpack-log": { @@ -21519,7 +21159,6 @@ "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" @@ -21534,7 +21173,6 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, - "license": "MIT", "bin": { "uuid": "bin/uuid" } @@ -21544,7 +21182,6 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, - "license": "MIT", "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -21555,7 +21192,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -21565,7 +21201,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -21578,7 +21213,6 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -21592,7 +21226,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -21602,7 +21235,6 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -21617,7 +21249,6 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -21632,7 +21263,6 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } @@ -21642,7 +21272,6 @@ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, - "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -21653,7 +21282,6 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -21669,7 +21297,6 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "is-bigint": "^1.0.1", @@ -21683,15 +21310,14 @@ } }, "node_modules/which-builtin-type": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", @@ -21700,8 +21326,8 @@ "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -21710,29 +21336,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21741,22 +21355,20 @@ "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "license": "ISC" + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -21769,7 +21381,6 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -21779,7 +21390,6 @@ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "dev": true, - "license": "MIT", "dependencies": { "errno": "~0.1.7" } @@ -21788,7 +21398,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-1.1.1.tgz", "integrity": "sha512-qJZLVS/jMCBITDzPo/RuweYSIG8VJP5P67mP/71alGyTZRe1LYJFdwLjLalY3T5ifx0bMDRD3OB6P2p1escvlg==", - "license": "MIT", "dependencies": { "loader-utils": "^1.0.0", "schema-utils": "^0.4.0" @@ -21804,7 +21413,6 @@ "version": "0.4.7", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "license": "MIT", "dependencies": { "ajv": "^6.1.0", "ajv-keywords": "^3.1.0" @@ -21818,7 +21426,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -21836,7 +21443,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -21852,7 +21458,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -21864,25 +21469,23 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "dev": true }, "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==", - "license": "ISC" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "license": "MIT", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA==", + "dev": true, "dependencies": { "mkdirp": "^0.5.1" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, "node_modules/write-file-atomic": { @@ -21890,7 +21493,6 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -21912,15 +21514,13 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "dev": true, - "license": "Apache-2.0" + "dev": true }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4" } @@ -21928,119 +21528,132 @@ "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "license": "ISC" + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, - "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "license": "MIT", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^3.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" } }, "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "license": "ISC", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "license": "MIT", + "node_modules/yargs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/yargs/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "license": "ISC", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "license": "MIT" - }, - "node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", + "node_modules/yargs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { - "locate-path": "^3.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "license": "MIT", + "node_modules/yargs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/yargs/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": ">=4" + "node": ">=8" } }, "node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", + "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": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/yargs/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==", - "license": "MIT", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -22052,73 +21665,38 @@ } }, "node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "license": "MIT", + "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.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/yargs/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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, + "dev": true, "engines": { "node": ">=6" } }, "node_modules/yargs/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "license": "MIT", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/yauzl": { @@ -22126,7 +21704,6 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, - "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -22137,7 +21714,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index e4784b35a00..e8b334e8f1b 100644 --- a/package.json +++ b/package.json @@ -52,17 +52,19 @@ "immutable": "3.8.2", "scratch-parser": "github:TurboWarp/scratch-parser#master", "scratch-sb1-converter": "0.2.7", - "scratch-translate-extension-languages": "0.0.20191118205314", + "scratch-translate-extension-languages": "^1.0.7", "text-encoding": "0.7.0", "uuid": "8.3.2", "worker-loader": "^1.1.1" }, "peerDependencies": { - "@turbowarp/scratch-svg-renderer": "^1.0.0-202312300007-62fe825" + "@turbowarp/scratch-svg-renderer": "^1.1.0" }, "devDependencies": { "@babel/core": "7.13.10", + "@babel/eslint-parser": "7.23.3", "@babel/preset-env": "7.14.8", + "@turbowarp/scratch-svg-renderer": "1.1.0", "@types/tap": "^15.0.12", "adm-zip": "0.4.11", "babel-eslint": "10.1.0", diff --git a/src/blocks/scratch3_data.js b/src/blocks/scratch3_data.js index 301984e341b..b20e8de3ca0 100644 --- a/src/blocks/scratch3_data.js +++ b/src/blocks/scratch3_data.js @@ -100,7 +100,7 @@ class Scratch3DataBlocks { // Return original list value if up-to-date, which doesn't trigger monitor update. if (list._monitorUpToDate) return list.value; // If value changed, reset the flag and return a copy to trigger monitor update. - // Because monitors use Immutable data structures, only new objects trigger updates. + // MonitorState only detects updates when the object changes. list._monitorUpToDate = true; return list.value.slice(); } @@ -191,6 +191,10 @@ class Scratch3DataBlocks { const list = util.target.lookupOrCreateList( args.LIST.id, args.LIST.name); + if (this.runtime && this.runtime.runtimeOptions.caseSensitiveLists) { + return list.value.indexOf(item) + 1; + } + // Go through the list items one-by-one using Cast.compare. This is for // cases like checking if 123 is contained in a list [4, 7, '123'] -- // Scratch considers 123 and '123' to be equal. @@ -230,6 +234,9 @@ class Scratch3DataBlocks { const item = args.ITEM; const list = util.target.lookupOrCreateList( args.LIST.id, args.LIST.name); + if (this.runtime && this.runtime.runtimeOptions.caseSensitiveLists) { + return list.value.indexOf(item) !== -1; + } if (list.value.indexOf(item) >= 0) { return true; } diff --git a/src/blocks/scratch3_json.js b/src/blocks/scratch3_json.js index 233e85b36c7..1ff48c60857 100644 --- a/src/blocks/scratch3_json.js +++ b/src/blocks/scratch3_json.js @@ -399,10 +399,11 @@ class Scratch3JsonBlocks { const list = util.target.lookupVariableByNameAndType(args.LIST?.name || args.LIST, '', true); if (!list) return ''; - const type = args.TYPE || 'array'; + const type = String(args.TYPE || args.FORMAT || 'array').toLowerCase(); if (type === 'json') { return JSON.stringify(list.value); } + if (type === 'string') return list.value.join(', '); return list.value; } @@ -415,7 +416,7 @@ class Scratch3JsonBlocks { const list = util.target.lookupVariableByNameAndType(args.LIST?.name || args.LIST, '', true); if (!list) return; - const value = args.VALUE; + const value = typeof args.ARRAY === 'undefined' ? args.VALUE : args.ARRAY; if (typeof value === 'string') { try { diff --git a/src/blocks/scratch3_looks.js b/src/blocks/scratch3_looks.js index 9bcdc452b92..8c1039066af 100644 --- a/src/blocks/scratch3_looks.js +++ b/src/blocks/scratch3_looks.js @@ -305,9 +305,9 @@ class Scratch3LooksBlocks { looks_gotofrontback: this.goToFrontBack, looks_goforwardbackwardlayers: this.goForwardBackwardLayers, looks_size: this.getSize, + looks_costumes: this.getCostumes, looks_costumenumbername: this.getCostumeNumberName, - looks_backdropnumbername: this.getBackdropNumberName, - looks_costumes: this.getCostumes + looks_backdropnumbername: this.getBackdropNumberName }; } @@ -355,7 +355,6 @@ class Scratch3LooksBlocks { think (args, util) { this._think(args.MESSAGE, util.target); } - _think (message, target) { // used by compiler this.runtime.emit(Scratch3LooksBlocks.SAY_OR_THINK, target, 'think', message); } @@ -386,10 +385,6 @@ class Scratch3LooksBlocks { this._renderBubble(util.target); } - getCostumes (args, util) { - return JSON.stringify(util.target.sprite.costumes.map(costume => costume.name)); - } - /** * Utility function to set the costume of a target. * Matches the behavior of Scratch 2.0 for different types of arguments. @@ -603,6 +598,10 @@ class Scratch3LooksBlocks { return Math.round(util.target.size); } + getCostumes (args, util) { + return JSON.stringify(util.target.getCostumes().map(costume => costume.name)); + } + getBackdropNumberName (args) { const stage = this.runtime.getTargetForStage(); if (args.NUMBER_NAME === 'number') { diff --git a/src/blocks/scratch3_motion.js b/src/blocks/scratch3_motion.js index b67d748822d..0d5a54a0e4b 100644 --- a/src/blocks/scratch3_motion.js +++ b/src/blocks/scratch3_motion.js @@ -156,8 +156,8 @@ class Scratch3MotionBlocks { } pointTowards_xyfrom (args, util) { - const dx = util.target.x - Cast.toNumber(args.FROMX); - const dy = util.target.y - Cast.toNumber(args.FROMY); + const dx = Cast.toNumber(args.X) - Cast.toNumber(args.FROMX); + const dy = Cast.toNumber(args.Y) - Cast.toNumber(args.FROMY); const direction = 90 - MathUtil.radToDeg(Math.atan2(dy, dx)); util.target.setDirection(direction); } diff --git a/src/blocks/scratch3_operators.js b/src/blocks/scratch3_operators.js index c7163b74034..a6f4aa1459e 100644 --- a/src/blocks/scratch3_operators.js +++ b/src/blocks/scratch3_operators.js @@ -46,6 +46,9 @@ class Scratch3OperatorsBlocks { operator_repeat: this.repeat, operator_change_case: this.changeCase, operator_trim: this.trim, + operator_clamp: this.clamp, + operator_min: this.min, + operator_max: this.max, operator_mod: this.mod, operator_pi: this.pi, operator_newline: this.newline, @@ -90,6 +93,24 @@ class Scratch3OperatorsBlocks { return result; } + clamp (args) { + return Math.min(Math.max(Cast.toNumber(args.NUM), Cast.toNumber(args.MIN)), Cast.toNumber(args.MAX)); + } + + min (args) { + const count = operandCount(args); + let result = Infinity; + for (let i = 1; i <= count; i++) result = Math.min(result, Cast.toNumber(args[`NUM${i}`])); + return result; + } + + max (args) { + const count = operandCount(args); + let result = -Infinity; + for (let i = 1; i <= count; i++) result = Math.max(result, Cast.toNumber(args[`NUM${i}`])); + return result; + } + lt (args) { return Cast.compare(args.OPERAND1, args.OPERAND2) < 0; } @@ -179,9 +200,11 @@ class Scratch3OperatorsBlocks { } indexOf (args) { - return Cast.toString(args.STRING).toLowerCase().indexOf( - Cast.toString(args.SUBSTRING).toLowerCase() - ) + 1; + return Cast.toString(args.STRING) + .toLowerCase() + .indexOf( + Cast.toString(args.SUBSTRING).toLowerCase() + ) + 1; } replace (args) { diff --git a/src/blocks/scratch3_sensing.js b/src/blocks/scratch3_sensing.js index 88a5e0d24ce..287de120dfb 100644 --- a/src/blocks/scratch3_sensing.js +++ b/src/blocks/scratch3_sensing.js @@ -71,9 +71,11 @@ class Scratch3SensingBlocks { sensing_loud: this.isLoud, sensing_askandwait: this.askAndWait, sensing_answer: this.getAnswer, - sensing_online: this.isOnline, sensing_username: this.getUsername, - sensing_userid: () => {} // legacy no-op block + sensing_userid: () => {}, // legacy no-op block + sensing_stagewidth: () => this.runtime.stageWidth, + sensing_stageheight: () => this.runtime.stageHeight, + sensing_online: this.isOnline }; } @@ -105,6 +107,9 @@ class Scratch3SensingBlocks { // importing multiple monitors from the same opcode from sb2 files, // something that is not currently supported in scratch 3. getId: (_, fields) => getMonitorIdForBlockWithArgs('current', fields) // _${param}` + }, + sensing_online: { + getId: () => 'online' } }; } @@ -342,19 +347,18 @@ class Scratch3SensingBlocks { return 0; } - isOnline () { - const status = window.navigator.onLine; - if (typeof status === 'boolean') { - return status; - } - // an empty string will evaluate as false in a Boolean context, - // but it allows distinguishing between "false" and "unknown" if needed - return ''; - } - getUsername (args, util) { return util.ioQuery('userData', 'getUsername'); } + + isOnline () { + // Modern Node.js has a navigator object but does .onLine === undefined + if (typeof navigator === 'object' && typeof navigator.onLine === 'boolean') { + return navigator.onLine; + } + // We're running in some non-browser environment. We probably have internet. + return true; + } } module.exports = Scratch3SensingBlocks; diff --git a/src/compiler/compat-block-utility.js b/src/compiler/compat-block-utility.js index 6fedba1d9d2..1afade0e27e 100644 --- a/src/compiler/compat-block-utility.js +++ b/src/compiler/compat-block-utility.js @@ -1,13 +1,16 @@ +// @ts-check + const BlockUtility = require('../engine/block-utility'); class CompatibilityLayerBlockUtility extends BlockUtility { constructor () { super(); + this._stackFrame = {}; this._startedBranch = null; } get stackFrame () { - return this.thread.compatibilityStackFrame; + return this.thread?.compatibilityStackFrame; } startBranch (branchNumber, isLoop) { diff --git a/src/compiler/compat-blocks.js b/src/compiler/compat-blocks.js index abcb8148c10..6e30b521101 100644 --- a/src/compiler/compat-blocks.js +++ b/src/compiler/compat-blocks.js @@ -1,9 +1,4 @@ -/** - * @fileoverview List of blocks to be supported in the compiler compatibility layer. - * This is only for native blocks. Extensions should not be listed here. - */ - -// Please keep these lists alphabetical. +// Native primitives without dedicated compiler implementations. const stacked = [ 'assets_delete', @@ -36,21 +31,4 @@ const stacked = [ 'sound_stopallsounds' ]; -const inputs = [ - 'assets_allnames', - 'assets_byte', - 'assets_check', - 'assets_get', - 'assets_infolder', - 'motion_xscroll', - 'motion_yscroll', - 'sensing_loud', - 'sensing_loudness', - 'sensing_userid', - 'sound_volume' -]; - -module.exports = { - stacked, - inputs -}; +module.exports = {stacked}; diff --git a/src/compiler/compile.js b/src/compiler/compile.js index 2cf2308502c..3b5125f5efe 100644 --- a/src/compiler/compile.js +++ b/src/compiler/compile.js @@ -1,27 +1,20 @@ // @ts-check -// eslint-disable-next-line no-unused-vars -const Thread = require('../engine/thread'); -// eslint-disable-next-line no-unused-vars -const {IntermediateScript} = require('./intermediate'); const {IRGenerator} = require('./irgen'); +const {IROptimizer} = require('./iroptimizer'); const JSGenerator = require('./jsgen'); -/** - * @param {Thread} thread - * @returns {Object} - */ -const compile = thread => { +const compile = (/** @type {import("../engine/thread")} */ thread) => { const irGenerator = new IRGenerator(thread); const ir = irGenerator.generate(); - const procedures = Object.create(null); + const irOptimizer = new IROptimizer(ir); + irOptimizer.optimize(); + + const procedures = {}; const target = thread.target; - /** - * @param {IntermediateScript} script - */ - const compileScript = script => { + const compileScript = (/** @type {import("./intermediate").IntermediateScript} */ script) => { if (script.cachedCompileResult) { return script.cachedCompileResult; } diff --git a/src/compiler/enums.js b/src/compiler/enums.js index dcbe045317e..e08e40174ea 100644 --- a/src/compiler/enums.js +++ b/src/compiler/enums.js @@ -1,326 +1,324 @@ // @ts-check -const TYPES = { +/** + * @fileoverview Common enums shared amongst parts of the compiler. + */ + + +/** + * Enum for the type of the value that is returned by reporter blocks and stored in constants. + * + * At compile time, often we don't know exactly type a value will be but we can tell it must be one of a + * set of types. For this reason, the number value of each type represents a possibility space, where set + * bits indicate that their corropoding type *could* be encountered at runtime. + * For example, a type of InputType.NUMBER | InputType.STRING means the value will be either a number or + * a string at runtime, the compiler can't tell which, but we do know that it's not a boolean or NaN as + * those bits are not set. + * + * @readonly + * @enum {number} + */ +const InputType = { + /** The value Infinity */ NUMBER_POS_INF: 0x001, + /** Any natural number */ NUMBER_POS_INT: 0x002, + /** Any positive fractional number, excluding integers. */ NUMBER_POS_FRACT: 0x004, + /** Any positive number excluding 0 and Infinity. Equal to NUMBER_POS_INT | NUMBER_POS_FRACT */ NUMBER_POS_REAL: 0x006, + /** The value 0 */ NUMBER_ZERO: 0x008, + /** The value -0 */ NUMBER_NEG_ZERO: 0x010, + /** Any negitive integer excluding -0 */ NUMBER_NEG_INT: 0x020, + /** Any negitive fractional number, excluding integers. */ NUMBER_NEG_FRACT: 0x040, + /** Any negitive number excluding -0 and -Infinity. Equal to NUMBER_NEG_INT | NUMBER_NEG_FRACT */ NUMBER_NEG_REAL: 0x060, + /** The value -Infinity */ NUMBER_NEG_INF: 0x080, - NAN: 0x100, + /** The value NaN */ + NUMBER_NAN: 0x100, + /** Either 0 or -0. Equal to NUMBER_ZERO | NUMBER_NEG_ZERO */ NUMBER_ANY_ZERO: 0x018, + /** Either Infinity or -Infinity. Equal to NUMBER_POS_INF | NUMBER_NEG_INF */ NUMBER_INF: 0x081, + /** Any positive number, excluding 0. Equal to NUMBER_POS_REAL | NUMBER_POS_INF */ NUMBER_POS: 0x007, + /** Any negitive number, excluding -0. Equal to NUMBER_NEG_REAL | NUMBER_NEG_INF */ NUMBER_NEG: 0x0E0, + /** Any whole number. Equal to NUMBER_POS_INT | NUMBER_ZERO */ NUMBER_WHOLE: 0x00A, - NUMBER_FRACT: 0x044, + /** Any integer. Equal to NUMBER_POS_INT | NUMBER_ANY_ZERO | NUMBER_NEG_INT */ + NUMBER_INT: 0x03A, + /** Any number that works as an array index. Equal to NUMBER_INT | NUMBER_INF | NUMBER_NAN */ + NUMBER_INDEX: 0x1BB, + /** Any fractional non-integer numbers. Equal to NUMBER_POS_FRACT | NUMBER_NEG_FRACT */ + NUMBER_FRACT: 0x44, + /** Any real number. Equal to NUMBER_POS_REAL | NUMBER_ANY_ZERO | NUMBER_NEG_REAL */ NUMBER_REAL: 0x07E, + /** Any number, excluding NaN. Equal to NUMBER_REAL | NUMBER_INF */ NUMBER: 0x0FF, + /** Any number, including NaN. Equal to NUMBER | NUMBER_NAN */ NUMBER_OR_NAN: 0x1FF, - NUMBER_INDEX: 0x1BB, + /** Anything that can be interperated as a number. Equal to NUMBER | STRING_NUM | BOOLEAN */ NUMBER_INTERPRETABLE: 0x12FF, + /** Any string which as a non-NaN neumeric interpretation, excluding ''. */ STRING_NUM: 0x200, + /** Any string which has no non-NaN neumeric interpretation, including ''. */ STRING_NAN: 0x400, + /** Either of the strings 'true' or 'false'. */ STRING_BOOLEAN: 0x800, + + /** Any string. Equal to STRING_NUM | STRING_NAN | STRING_BOOLEAN */ STRING: 0xE00, + /** Any boolean. */ BOOLEAN: 0x1000, + /** Any input that can be interperated as a boolean. Equal to BOOLEAN | STRING_BOOLEAN */ BOOLEAN_INTERPRETABLE: 0x1800, - OBJECT: 0x2000, - ARRAY: 0x4000, - - ANY: 0x47FFF, - COLOR: 0x8000, + /** Any value type (a type a scratch variable can hold). Equal to NUMBER_OR_NAN | STRING | BOOLEAN */ + ANY: 0x1FFF, - NUMBER_INT: 0x03A, - NUMBER_NAN: 0x1FF, - UNKNOWN: 0x47FFF, - LOWER_STRING: 0x10000, - PROCEDURE_ARG: 0x20000, - // Native object or array used by compiled extension blocks. - JSON: 0x40000, - // A JSON item: native JSON or a Scratch-compatible primitive. - JSON_VALUE: 0x41FFF + /** An array of values in the form [R, G, B] */ + COLOR: 0x2000 }; -let INPUT_I = 1; -const id = () => INPUT_I++; - -const BLOCKS = { - MOTION: { - X_POSITION: id(), - Y_POSITION: id(), - DIRECTION: id(), - CHANGE_X: id(), - CHANGE_Y: id(), - SET_ROTATION_STYLE: id(), - SET_XY: id(), - SET_X: id(), - SET_Y: id(), - SET_DIRECTION: id(), - POINT_TOWARDS_XY: id(), - POINT_TOWARDS_XY_FROM: id(), - STEP: id(), - IF_ON_EDGE_BOUNCE: id() - }, - - CONSTANT: id(), - - COUNTER: { - GET: id(), - INCR: id(), - CLEAR: id() - }, - - KEYBOARD: { - PRESSED: id() - }, - - VAR: { - GET: id(), - SET: id(), - CHANGE: id(), - SHOW: id(), - HIDE: id() - }, - - LIST: { - CONTAINS: id(), - CONTENTS: id(), - GET: id(), - INDEXOF: id(), - LENGTH: id(), - AS: id(), - ADD: id(), - DELETE: id(), - DELETE_ALL: id(), - HIDE: id(), - INSERT: id(), - REPLACE: id(), - SHOW: id(), - SET_ARRAY: id() - }, - - LOOKS: { - BACKDROP_NUMBER: id(), - BACKDROP_NAME: id(), - COSTUME_NUMBER: id(), - COSTUME_NAME: id(), - SIZE: id(), - COSTUMES: id(), - FORWARD_LAYERS: id(), - BACKWARD_LAYERS: id(), - CLEAR_EFFECTS: id(), - CHANGE_EFFECT: id(), - CHANGE_SIZE: id(), - GOTO_BACK: id(), - GOTO_FRONT: id(), - HIDE: id(), - NEXT_BACKDROP: id(), - NEXT_COSTUME: id(), - SET_EFFECT: id(), - SET_SIZE: id(), - SHOW: id(), - SWITCH_BACKDROP: id(), - SWITCH_COSTUME: id(), - SAY: id(), - THINK: id() - }, - - SENSING: { - ANSWER: id(), - COLOR_TOUCHING_COLOR: id(), - YEAR: id(), - DATE: id(), - DAYOFWEEK: id(), - DAYS_SINCE_2000: id(), - DISTANCE: id(), - HOUR: id(), - MINUTE: id(), - MONTH: id(), - OF: id(), - REFRESH_TIME: id(), - SECOND: id(), - TODAY: id(), - TOUCHING_COLOR: id(), - TOUCHING: id(), - ONLINE: id(), - USERNAME: id() - }, - - MOUSE: { - DOWN: id(), - X: id(), - Y: id() - }, - - OP: { - ABS: id(), - ACOS: id(), - ASIN: id(), - ATAN: id(), - CEILING: id(), - COS: id(), - FLOOR: id(), - LN: id(), - LOG: id(), - ROUND: id(), - SIN: id(), - SQRT: id(), - TAN: id(), - ADD: id(), - SUBTRACT: id(), - MULTIPLY: id(), - DIVIDE: id(), - RANDOM: id(), - NOT: id(), - OR: id(), - AND: id(), - CHANGECASE: id(), - EQUALS: id(), - GREATER: id(), - INDEXOF: id(), - LESS: id(), - LETTEROF: id(), - LETTERSOF: id(), - LENGTH: id(), - CONTAINS: id(), - MOD: id(), - EXP: id(), - JOIN: id(), - REPEAT: id(), - REPLACE: id(), - TENEXP: id(), - TRIM: id(), - PI: id(), - NEWLINE: id() - }, - - PROCEDURES: { - ARGUMENT: id(), - CALL: id(), - RETURN: id(), - DEFINITION: id() - }, - - NOOP: id(), - - COMPAT: id(), - - EXTENSION: id(), - - ADDONS: { - CALL: id() - }, - - CONTROL: { - IF: id(), - REPEAT: id(), - REPEAT_UNTIL: id(), - FOR: id(), - WHILE: id(), - SWITCH: id(), - CASE: id(), - DEFAULT: id(), - BREAK: id(), - CASE_FALLTHROUGH: id(), - DELETE_CLONE: id(), - CREATE_CLONE: id(), - STOP_ALL: id(), - STOP_OTHERS: id(), - STOP_SCRIPT: id(), - WAIT: id(), - WAIT_UNTIL: id() - }, - - HAT: { - EDGE: id(), - PREDICATE: id() - }, - - EVENT: { - BROADCAST: id(), - BROADCAST_AND_WAIT: id() - }, - - PEN: { - CLEAR: id(), - CHANGE_PARAM: id(), - CHANGE_HUE: id(), - CHANGE_SHADE: id(), - CHANGE_SIZE: id(), - LEGACY_CHANGE_HUE: id(), - LEGACY_CHANGE_SHADE: id(), - LEGACY_SET_HUE: id(), - LEGACY_SET_SHADE: id(), - DOWN: id(), - UP: id(), - SET_COLOR: id(), - SET_PARAM: id(), - SET_SIZE: id(), - STAMP: id(), - PRINT_TEXT: id(), - DRAW_TRIANGLE: id() - }, - - SOUND: { - CHANGE_VOLUME: id(), - SET_VOLUME: id(), - PLAY_SOUND: id(), - STOP_ALL_SOUNDS: id(), - STOP_OTHER_SOUNDS: id(), - STOP_THIS_SOUND: id() - }, - - TIMER: { - RESET: id(), - GET: id() - }, - - TW: { - DEBUGGER: id(), - LAST_KEY_PRESSED: id() - }, - - VISUAL_REPORT: id() +/** + * Enum for the opcodes of the stackable blocks used in the IR AST. + * @readonly + * @enum {string} + */ +const StackOpcode = { + NOP: 'noop', + + ADDON_CALL: 'addons.call', + DEBUGGER: 'tw.debugger', + VISUAL_REPORT: 'visualReport', + COMPATIBILITY_LAYER: 'compat', + OLD_COMPILER_COMPATIBILITY_LAYER: 'oldCompiler', + EXTENSION: 'extension', + RAW_SOURCE: 'rawSource', + + HAT_EDGE: 'hat.edge', + HAT_PREDICATE: 'hat.predicate', + + CONTROL_IF_ELSE: 'control.if', + CONTROL_CLONE_CREATE: 'control.createClone', + CONTROL_CLONE_DELETE: 'control.deleteClone', + CONTROL_WHILE: 'control.while', + CONTROL_FOR: 'control.for', + CONTROL_REPEAT: 'control.repeat', + CONTROL_STOP_ALL: 'control.stopAll', + CONTROL_STOP_OTHERS: 'control.stopOthers', + CONTROL_STOP_SCRIPT: 'control.stopScript', + CONTROL_WAIT: 'control.wait', + CONTROL_WAIT_UNTIL: 'control.waitUntil', + CONTROL_CLEAR_COUNTER: 'control.counterClear', + CONTORL_INCR_COUNTER: 'control.counterIncr', + CONTROL_SWITCH: 'control.switch', + CONTROL_CASE: 'control.case', + CONTROL_DEFAULT: 'control.default', + CONTROL_BREAK: 'control.break', + CONTROL_CASE_FALLTHROUGH: 'control.caseFallthrough', + + LIST_ADD: 'list.add', + LIST_INSERT: 'list.instert', + LIST_REPLACE: 'list.replace', + LIST_DELETE_ALL: 'list.deleteAll', + LIST_DELETE: 'list.delete', + LIST_SHOW: 'list.show', + LIST_HIDE: 'list.hide', + LIST_SET_ARRAY: 'list.setArray', + + VAR_SET: 'var.set', + VAR_SHOW: 'var.show', + VAR_HIDE: 'var.hide', + + EVENT_BROADCAST: 'event.broadcast', + EVENT_BROADCAST_AND_WAIT: 'event.broadcastAndWait', + + LOOKS_EFFECT_SET: 'looks.setEffect', + LOOKS_EFFECT_CHANGE: 'looks.changeEffect', + LOOKS_EFFECT_CLEAR: 'looks.clearEffects', + LOOKS_SIZE_CHANGE: 'looks.changeSize', + LOOKS_SIZE_SET: 'looks.setSize', + LOOKS_LAYER_FORWARD: 'looks.forwardLayers', + LOOKS_LAYER_BACKWARD: 'looks.backwardLayers', + LOOKS_LAYER_FRONT: 'looks.goToFront', + LOOKS_LAYER_BACK: 'looks.goToBack', + LOOKS_HIDE: 'looks.hide', + LOOKS_SHOW: 'looks.show', + LOOKS_BACKDROP_NEXT: 'looks.nextBackdrop', + LOOKS_BACKDROP_SET: 'looks.switchBackdrop', + LOOKS_COSTUME_NEXT: 'looks.nextCostume', + LOOKS_COSTUME_SET: 'looks.switchCostume', + LOOKS_SAY: 'looks.say', + LOOKS_THINK: 'looks.think', + + MOTION_X_SET: 'motion.setX', + MOTION_X_CHANGE: 'motion.changeX', + MOTION_Y_SET: 'motion.setY', + MOTION_Y_CHANGE: 'motion.changeY', + MOTION_XY_SET: 'motion.setXY', + MOTION_IF_ON_EDGE_BOUNCE: 'motion.ifOnEdgeBounce', + MOTION_STEP: 'motion.step', + MOTION_ROTATION_STYLE_SET: 'motion.setRotationStyle', + MOTION_DIRECTION_SET: 'motion.setDirection', + MOTION_POINT_TOWARDS_XY: 'motion.pointTowardsXY', + MOTION_POINT_TOWARDS_XY_FROM: 'motion.pointTowardsXYFrom', + + PEN_UP: 'pen.up', + PEN_DOWN: 'pen.down', + PEN_CLEAR: 'pen.clear', + PEN_COLOR_PARAM_SET: 'pen.setParam', + PEN_COLOR_PARAM_CHANGE: 'pen.changeParam', + PEN_COLOR_HUE_CHANGE_LEGACY: 'pen.legacyChangeHue', + PEN_COLOR_HUE_SET_LEGACY: 'pen_setPenHueToNumber', + PEN_COLOR_SHADE_CHANGE_LEGACY: 'pen.legacyChangeShade', + PEN_COLOR_SHADE_SET_LEGACY: 'pen.legacySetShade', + PEN_COLOR_SET: 'pen.setColor', + PEN_SIZE_SET: 'pen.setSize', + PEN_SIZE_CHANGE: 'pen.changeSize', + PEN_STAMP: 'pen.stamp', + PEN_PRINT_TEXT: 'pen.printText', + PEN_DRAW_TRIANGLE: 'pen.drawTriangle', + + SENSING_TIMER_RESET: 'timer.reset', + + PROCEDURE_RETURN: 'procedures.return', + PROCEDURE_CALL: 'procedures.call' }; /** - * @param {number} typeId - * @returns {string|undefined} + * Enum for the opcodes of the reporter blocks used in the IR AST. + * @readonly + * @enum {string} */ -const getNameForType = typeId => { - /** - * @param {object} obj - * @param {string} path - * @returns {string|undefined} - */ - const search = (obj, path) => { - for (const [key, val] of Object.entries(obj)) { - const newPath = path ? `${path}.${key}` : key; - if (typeof val === 'number') { - if (val === typeId) return newPath; - } else if (val && typeof val === 'object') { - const found = search(val, newPath); - if (found) return found; - } - } - }; - - return search(BLOCKS, 'BLOCKS'); +const InputOpcode = { + NOP: 'noop', + + ADDON_CALL: 'addons.call', + CONSTANT: 'constant', + + CAST_NUMBER: 'cast.toNumber', + CAST_NUMBER_INDEX: 'cast.toInteger', + CAST_NUMBER_OR_NAN: 'cast.toNumberOrNaN', + CAST_STRING: 'cast.toString', + CAST_BOOLEAN: 'cast.toBoolean', + CAST_COLOR: 'cast.toColor', + + COMPATIBILITY_LAYER: 'compat', + OLD_COMPILER_COMPATIBILITY_LAYER: 'oldCompiler', + EXTENSION: 'extension', + RAW_SOURCE: 'rawSource', + + LOOKS_BACKDROP_NUMBER: 'looks.backdropNumber', + LOOKS_BACKDROP_NAME: 'looks.backdropName', + LOOKS_COSTUME_NUMBER: 'looks.costumeNumber', + LOOKS_COSTUME_NAME: 'looks.costumeName', + LOOKS_SIZE_GET: 'looks.size', + LOOKS_COSTUMES: 'looks.costumes', + + VAR_GET: 'var.get', + + LIST_GET: 'list.get', + LIST_LENGTH: 'list.length', + LIST_CONTAINS: 'list.contains', + LIST_INDEX_OF: 'list.indexOf', + LIST_CONTENTS: 'list.contents', + LIST_AS: 'list.as', + + MOTION_X_GET: 'motion.x', + MOTION_Y_GET: 'motion.y', + MOTION_DIRECTION_GET: 'motion.direction', + + OP_ADD: 'op.add', + OP_AND: 'op.and', + OP_CONTAINS: 'op.contains', + OP_DIVIDE: 'op.divide', + OP_EQUALS: 'op.equals', + OP_GREATER: 'op.greater', + OP_LESS: 'op.less', + OP_JOIN: 'op.join', + OP_LENGTH: 'op.length', + OP_LETTER_OF: 'op.letterOf', + OP_LETTERS_OF: 'op.lettersOf', + OP_INDEX_OF: 'op.indexOf', + OP_CHANGE_CASE: 'op.changeCase', + OP_REPEAT: 'op.repeat', + OP_REPLACE: 'op.replace', + OP_TRIM: 'op.trim', + OP_ABS: 'op.abs', + OP_FLOOR: 'op.floor', + OP_CEILING: 'op.ceiling', + OP_SQRT: 'op.sqrt', + OP_SIN: 'op.sin', + OP_COS: 'op.cos', + OP_TAN: 'op.tan', + OP_ASIN: 'op.asin', + OP_ACOS: 'op.acos', + OP_ATAN: 'op.atan', + OP_LOG_E: 'op.ln', + OP_LOG_10: 'op.log', + OP_POW_E: 'op.e^', + OP_POW_10: 'op.10^', + OP_MOD: 'op.mod', + OP_MULTIPLY: 'op.multiply', + OP_NOT: 'op.not', + OP_OR: 'op.or', + OP_RANDOM: 'op.random', + OP_ROUND: 'op.round', + OP_SUBTRACT: 'op.subtract', + + SENSING_ANSWER: 'sensing.answer', + SENSING_COLOR_TOUCHING_COLOR: 'sensing.colorTouchingColor', + SENSING_TIME_YEAR: 'sensing.year', + SENSING_TIME_MONTH: 'sensing.month', + SENSING_TIME_DATE: 'sensing.date', + SENSING_TIME_WEEKDAY: 'sensing.dayofweek', + SENSING_TIME_HOUR: 'sensing.hour', + SENSING_TIME_MINUTE: 'sensing.minute', + SENSING_TIME_SECOND: 'sensing.second', + SENSING_TIME_DAYS_SINCE_2000: 'sensing.daysSince2000', + SENSING_DISTANCE: 'sensing.distance', + SENSING_KEY_DOWN: 'keyboard.pressed', + SENSING_MOUSE_DOWN: 'mouse.down', + SENSING_MOUSE_X: 'mouse.x', + SENSING_MOUSE_Y: 'mouse.y', + SENSING_OF: 'sensing.of', + SENSING_OF_BACKDROP_NAME: 'sensing.of.backdropName', + SENSING_OF_BACKDROP_NUMBER: 'sensing.of.backdropNumber', + SENSING_OF_COSTUME_NAME: 'sensing.of.costumeName', + SENSING_OF_COSTUME_NUMBER: 'sensing.of.costumeNumber', + SENSING_OF_VOLUME: 'sensing.of.volume', + SENSING_OF_POS_X: 'sensing.of.x', + SENSING_OF_POS_Y: 'sensing.of.y', + SENSING_OF_DIRECTION: 'sensing.of.direction', + SENSING_OF_SIZE: 'sensing.of.size', + SENSING_OF_VAR: 'sensing.of.var', + SENSING_TIMER_GET: 'timer.get', + SENSING_TOUCHING_COLOR: 'sensing.touchingColor', + SENSING_TOUCHING_OBJECT: 'sensing.touching', + SENSING_USERNAME: 'sensing.username', + + PROCEDURE_CALL: 'procedures.call', + PROCEDURE_ARGUMENT: 'procedures.argument', + + CONTROL_COUNTER: 'control.counter', + + TW_KEY_LAST_PRESSED: 'tw.lastKeyPressed' }; -export { - TYPES, - BLOCKS, - getNameForType +module.exports = { + StackOpcode, + InputOpcode, + InputType }; diff --git a/src/compiler/environment.js b/src/compiler/environment.js index 75b300a64fe..a7b49c3155b 100644 --- a/src/compiler/environment.js +++ b/src/compiler/environment.js @@ -1,3 +1,4 @@ +// @ts-check /* eslint-disable no-eval */ /** diff --git a/src/compiler/extensions/index.js b/src/compiler/extensions/index.js deleted file mode 100644 index 8263581d49b..00000000000 --- a/src/compiler/extensions/index.js +++ /dev/null @@ -1,23 +0,0 @@ -const extensions = [ - require('./skyhigh173JSON') -]; - -const blocks = Object.create(null); -for (const extension of extensions) { - for (const [opcode, info] of Object.entries(extension.blocks)) { - blocks[`${extension.id}_${opcode}`] = { - extension: extension.id, - generate: extension.generate, - native: extension.isNative(opcode), - ...info - }; - } -} - -const get = opcode => blocks[opcode] || null; -const canCompile = (opcode, runtime) => { - const block = get(opcode); - return Boolean(block && (block.native || runtime[`ext_${block.extension}`])); -}; - -module.exports = {get, canCompile}; diff --git a/src/compiler/extensions/skyhigh173JSON.js b/src/compiler/extensions/skyhigh173JSON.js deleted file mode 100644 index 60b607885ae..00000000000 --- a/src/compiler/extensions/skyhigh173JSON.js +++ /dev/null @@ -1,251 +0,0 @@ -const {TYPES} = require('../enums'); -const {sanitize} = require('../shared'); - -const id = 'skyhigh173JSON'; -const block = (type, target = false) => ({type, target}); - -const blocks = { - json_is_valid: block(TYPES.BOOLEAN), - json_is: block(TYPES.BOOLEAN), - json_get_all: block(TYPES.JSON), - json_new: block(TYPES.JSON), - json_has_key: block(TYPES.BOOLEAN), - json_has_value: block(TYPES.BOOLEAN), - json_equal: block(TYPES.BOOLEAN), - json_jlength: block(TYPES.UNKNOWN), - json_get: block(TYPES.JSON_VALUE), - json_set: block(TYPES.JSON), - json_delete: block(TYPES.JSON), - json_length: block(TYPES.UNKNOWN), - json_array_get: block(TYPES.JSON_VALUE), - json_array_push: block(TYPES.JSON), - json_array_set: block(TYPES.JSON), - json_array_insert: block(TYPES.JSON), - json_array_delete: block(TYPES.JSON), - json_array_remove_all: block(TYPES.JSON), - json_array_itemH: block(TYPES.STRING), - json_array_from: block(TYPES.JSON), - json_array_fromto: block(TYPES.JSON), - json_array_reverse: block(TYPES.JSON), - json_array_flat: block(TYPES.JSON), - json_array_concat: block(TYPES.JSON), - json_array_filter: block(TYPES.JSON), - json_array_setlen: block(TYPES.JSON), - json_array_create: block(TYPES.JSON), - json_array_join: block(TYPES.STRING), - json_array_sort: block(TYPES.JSON), - json_array_analysis: block(TYPES.NUMBER_NAN), - json_vm_getlist: block(TYPES.JSON, true), - json_vm_setlist: block(null, true) -}; - -const helperSources = { - extJSONValue: `const extJSONValue = value => { - if (typeof value === "string" && ( - (value[0] === "[" && value[value.length - 1] === "]") || - (value[0] === "{" && value[value.length - 1] === "}") - )) { - try { - value = JSON.parse(value) ?? ""; - } catch { - // Keep the original string. - } - } - if (Number.isNaN(value)) return "NaN"; - if (value === Infinity) return "Infinity"; - if (value === -Infinity) return "-Infinity"; - return value ?? ""; - }`, - extJSONIsValid: `const extJSONIsValid = value => { - if (typeof value !== "string") return false; - value = value.trim(); - if (!( - (value[0] === "[" && value[value.length - 1] === "]") || - (value[0] === "{" && value[value.length - 1] === "}") - )) return false; - try { - JSON.parse(value); - return true; - } catch { - return false; - } - }`, - extJSONIs: `const extJSONIs = (json, type) => { - if (!extJSONIsValid(json)) return false; - const value = JSON.parse(json); - return type === "Array" ? Array.isArray(value) : type === "Object" && !Array.isArray(value); - }`, - extJSONGetAll: `const extJSONGetAll = (json, type) => { - try { - const keys = Object.keys(json); - if (type === "keys") return keys; - if (type === "values") return keys.map(key => json[key] ?? ""); - if (type === "datas") return keys.map(key => [key, json[key] ?? ""]); - } catch { - // Return an empty JSON value. - } - return []; - }`, - extJSONNew: `const extJSONNew = type => type === "Array" ? [] : {}`, - extJSONHasKey: `const extJSONHasKey = (json, key) => { - try { - return extJSONValue(key) in json; - } catch { - return false; - } - }`, - extJSONGet: `const extJSONGet = (json, key) => { - try { - if (Object.prototype.hasOwnProperty.call(json, key)) { - return json[key] ?? ""; - } - } catch { - // Return the extension's empty fallback. - } - return ""; - }`, - extJSONSet: `const extJSONSet = (json, key, value) => { - if (json === null || typeof json !== "object") return {}; - const result = Array.isArray(json) ? json.slice() : {...json}; - result[key] = extJSONValue(value); - return result; - }`, - extJSONDelete: `const extJSONDelete = (json, key) => { - if (json === null || typeof json !== "object") return {}; - const result = Array.isArray(json) ? json.slice() : {...json}; - delete result[key]; - return result; - }`, - extJSONLength: `const extJSONLength = json => { - try { - return Object.keys(json).length; - } catch { - return " "; - } - }`, - extJSONArrayGet: `const extJSONArrayGet = (json, index) => { - try { - index = +index; - if (Number.isNaN(index) || index === 0) return ""; - if (index > 0) index--; - return (index >= 0 ? json[index] : json[json.length + index]) ?? ""; - } catch { - return ""; - } - }`, - extJSONArrayPush: `const extJSONArrayPush = (json, value) => { - if (!Array.isArray(json)) return []; - const result = json.slice(); - result.push(extJSONValue(value)); - return result; - }`, - extJSONArraySet: `const extJSONArraySet = (json, index, value) => { - if (!Array.isArray(json)) return []; - const result = json.slice(); - result[index - 1] = extJSONValue(value); - return result; - }`, - extJSONArrayInsert: `const extJSONArrayInsert = (json, index, value) => { - if (!Array.isArray(json)) return []; - const result = json.slice(); - result.splice(index - 1, 0, extJSONValue(value)); - return result; - }`, - extJSONArrayDelete: `const extJSONArrayDelete = (json, index) => { - if (!Array.isArray(json)) return []; - const result = json.slice(); - result.splice(index - 1, 1); - return result; - }` -}; - -const helperDependencies = { - extJSONIs: ['extJSONIsValid'], - extJSONHasKey: ['extJSONValue'], - extJSONSet: ['extJSONValue'], - extJSONArrayPush: ['extJSONValue'], - extJSONArraySet: ['extJSONValue'], - extJSONArrayInsert: ['extJSONValue'] -}; - -const useHelper = (compiler, name) => { - for (const dependency of helperDependencies[name] || []) { - useHelper(compiler, dependency); - } - compiler.prependFunctions.set(name, helperSources[name]); - return name; -}; - -const findArgument = (values, name) => Object.keys(values || {}) - .find(candidate => candidate.toLowerCase() === name.toLowerCase()); - -const compileArgument = (node, compiler, name) => { - const inputName = findArgument(node.inputs, name); - if (inputName && node.inputs[inputName]) return compiler.descendInput(node.inputs[inputName]); - - const fieldName = findArgument(node.fields, name); - if (fieldName) { - const field = node.fields[fieldName]; - return compiler.safeConstantInput(field && typeof field === 'object' ? field.value : field); - } - - // Old projects and extension patches can omit menu shadows. Match Scratch's empty-input fallback. - return compiler.safeConstantInput(''); -}; - -const nativeCall = (node, compiler, helper, inputs, jsonInputs = [], valueInputs = []) => - `${useHelper(compiler, helper)}(${inputs - .map(name => { - const input = compileArgument(node, compiler, name); - if (jsonInputs.includes(name)) return input.asJSON(); - if (valueInputs.includes(name) && !input.isAlwaysConstant()) return input.source; - return input.asSafe(); - }) - .join(', ')})`; - -const nativeGenerators = { - json_is_valid: (node, compiler) => nativeCall(node, compiler, 'extJSONIsValid', ['json']), - json_is: (node, compiler) => nativeCall(node, compiler, 'extJSONIs', ['json', 'types']), - json_get_all: (node, compiler) => nativeCall(node, compiler, 'extJSONGetAll', ['json', 'Stype'], ['json']), - json_new: (node, compiler) => nativeCall(node, compiler, 'extJSONNew', ['json']), - json_has_key: (node, compiler) => nativeCall(node, compiler, 'extJSONHasKey', ['json', 'key'], ['json']), - json_jlength: (node, compiler) => nativeCall(node, compiler, 'extJSONLength', ['json'], ['json']), - json_get: (node, compiler) => nativeCall(node, compiler, 'extJSONGet', ['json', 'item'], ['json']), - json_set: (node, compiler) => nativeCall(node, compiler, 'extJSONSet', - ['json', 'item', 'value'], ['json'], ['value']), - json_delete: (node, compiler) => nativeCall(node, compiler, 'extJSONDelete', ['json', 'item'], ['json']), - json_length: (node, compiler) => nativeCall(node, compiler, 'extJSONLength', ['json'], ['json']), - json_array_get: (node, compiler) => nativeCall(node, compiler, 'extJSONArrayGet', ['json', 'item'], ['json']), - json_array_push: (node, compiler) => nativeCall(node, compiler, 'extJSONArrayPush', - ['json', 'item'], ['json'], ['item']), - json_array_set: (node, compiler) => nativeCall(node, compiler, 'extJSONArraySet', - ['json', 'pos', 'item'], ['json'], ['item']), - json_array_insert: (node, compiler) => nativeCall(node, compiler, 'extJSONArrayInsert', - ['json', 'pos', 'item'], ['json'], ['item']), - json_array_delete: (node, compiler) => nativeCall(node, compiler, 'extJSONArrayDelete', - ['json', 'item'], ['json']) -}; - -const generateExtensionCall = (node, compiler, info) => { - const args = []; - for (const [name, input] of Object.entries(node.inputs)) { - args.push(`"${sanitize(name)}":${compiler.descendInput(input).asSafe()}`); - } - for (const [name, value] of Object.entries(node.fields)) { - args.push(`"${sanitize(name)}":"${sanitize(value)}"`); - } - const method = node.opcode.substring(id.length + 1); - return `runtime.ext_${id}.${method}({${args.join(',')}}${info.target ? ', {target}' : ''})`; -}; - -const generate = (node, compiler, info) => { - const opcode = node.opcode.substring(id.length + 1); - const native = nativeGenerators[opcode]; - if (native) return native(node, compiler); - const source = generateExtensionCall(node, compiler, info); - return info.type === TYPES.JSON ? `(parseJSON(${source}) ?? {})` : source; -}; - -const isNative = opcode => Boolean(nativeGenerators[opcode]); - -module.exports = {id, blocks, generate, isNative}; diff --git a/src/compiler/inputs.js b/src/compiler/inputs.js deleted file mode 100644 index 8774b7b1704..00000000000 --- a/src/compiler/inputs.js +++ /dev/null @@ -1,542 +0,0 @@ -const {TYPES} = require('./enums'); -const Cast = require('../util/cast'); -const {sanitize} = require('./shared'); - -const getNumberInputType = number => { - if (number === Infinity) return TYPES.NUMBER_POS_INF; - if (number === -Infinity) return TYPES.NUMBER_NEG_INF; - if (number < 0) return Number.isInteger(number) ? TYPES.NUMBER_NEG_INT : TYPES.NUMBER_NEG_FRACT; - if (number > 0) return Number.isInteger(number) ? TYPES.NUMBER_POS_INT : TYPES.NUMBER_POS_FRACT; - if (Number.isNaN(number)) return TYPES.NAN; - if (Object.is(number, -0)) return TYPES.NUMBER_NEG_ZERO; - return TYPES.NUMBER_ZERO; -}; - -let CURRENT_GENERATOR; - -const setCurrentGenerator = generator => { - CURRENT_GENERATOR = generator; -}; - -setCurrentGenerator(null); - -/** - * @typedef {string | number | boolean} ConstantValue - */ - -/** - * @typedef Input - * @property {number} type The type of this input. - * @property {string} source The source code for this input. - * @property {JSGenerator|null} _generator The JSGenerator that created this input. - * @property {string?} _cacheVar The name of the variable caching this input, if any. - * @property {ConstantValue} [constantValue] The constant value of this input, if any. - * @property {() => string} asNumber gives the code to get the number version of the value - * @property {() => string} asInt gives the code to get the truncated integer version of the value - * @property {() => string} asNumberOrNaN gives the code to get the number version of the value, possibly NaN - * @property {() => string} asString gives the code to get the string version of the value - * @property {() => string} asStringOrEmpty gives the code to get the string version of the value ?? "" - * @property {() => string} asLowerString gives the code to get the lower-case version of the string - * @property {() => string} asBoolean gives the code to get the boolean version of the value - * @property {() => string} asJSON gives the code to get a native JSON value - * @property {() => string} asColor gives the code to get the color version of the value - * @property {() => string} asUnknown gives the code to get the value without any conversion - * @property {() => boolean} isSafe means that the value is safe to use without conversion - * @property {() => string} asSafe gives the code to get the value in a safe way (converted to string if not safe) - * @property {() => boolean} isAlwaysNumber means that a value is always a number (never NaN) - * @property {() => boolean} isAlwaysNumberOrNaN means that a value is either a number or NaN - * @property {() => boolean} isNeverNumber means that a value is never a number (always NaN or non-number) - * @property {() => boolean} isAlwaysInt means that a value is always an integer - * @property {() => boolean} isAlwaysFinite means that a value is always a finite number (never NaN or Infinity) - * @property {() => boolean} isAlwaysConstant means that a value is constant - * @property {(value: ConstantValue) => boolean} isConstant means that a value is always a specified constant - */ - -/** - * @implements {Input} - */ -class TypedInput { - /** - * @param {string} source The source code for this input. - * @param {number} type The type of this input. - */ - constructor (source, type) { - if (typeof type !== 'number') throw new Error('type is invalid'); - this.source = source; - this.type = type; - this._cacheVar = null; - this._lastLinePos = -1; - } - - isAlwaysType (type) { - return (this.type & type) === this.type; - } - - isSometimesType (type) { - return (this.type & type) !== 0; - } - - asNumber () { - if (this.isSometimesType(TYPES.JSON)) return `toNotNaN(+toScratchString(${this.source}))`; - if (this.isAlwaysType(TYPES.NUMBER)) return this.source; - if (this.isAlwaysType(TYPES.NUMBER_OR_NAN)) return `toNotNaN(${this.source})`; - return `toNotNaN(+${this.source})`; - } - - asInt () { - if (this.isSometimesType(TYPES.JSON)) return `(+toScratchString(${this.source}) | 0)`; - if (this.isAlwaysType(TYPES.NUMBER_INT)) return this.source; - return `(${this.source} | 0)`; - } - - asNumberOrNaN () { - if (this.isSometimesType(TYPES.JSON)) return `(+toScratchString(${this.source}))`; - if (this.isAlwaysType(TYPES.NUMBER_OR_NAN)) return this.source; - return `(+${this.source})`; - } - - asStringOrEmpty () { - if (this.isSometimesType(TYPES.JSON)) return `toScratchString(${this.source})`; - if (this.isAlwaysType(TYPES.STRING)) return this.source; - return `("" + ${this.source})`; - } - - asString () { - if (this.isSometimesType(TYPES.JSON)) return `toScratchString(${this.source})`; - if (this.isAlwaysType(TYPES.STRING)) return this.source; - return `("" + ${this.source})`; - } - - asLowerString () { - if (this.isSometimesType(TYPES.JSON)) return `toScratchString(${this.source}).toLowerCase()`; - if (this.isAlwaysType(TYPES.LOWER_STRING)) return this.source; - return `("" + ${this.source}).toLowerCase()`; - } - - asBoolean () { - if (this.isAlwaysType(TYPES.BOOLEAN)) return this.source; - return `toBoolean(${this.source})`; - } - - asJSON () { - if (this.isAlwaysType(TYPES.JSON)) return this.source; - return `parseJSON(${this.source})`; - } - - asColor () { - return this.asUnknown(); - } - - asUnknown () { - if (this.isSometimesType(TYPES.JSON) && this.isAlwaysType(TYPES.JSON_VALUE)) { - return `toScratchValue(${this.source})`; - } - return `${this.source}`; - } - - isSafe () { - return true; - } - - asSafe () { - return this.asUnknown(); - } - - isAlwaysInt () { - return this.isAlwaysType(TYPES.NUMBER_INT); - } - - isAlwaysNumber () { - return this.isAlwaysType(TYPES.NUMBER); - } - - isAlwaysNumberOrNaN () { - return this.isAlwaysType(TYPES.NUMBER_OR_NAN); - } - - isNeverNumber () { - return !this.isSometimesType(TYPES.NUMBER_INTERPRETABLE); - } - - isAlwaysFinite () { - return this.isAlwaysType(TYPES.NUMBER_REAL); - } - - isAlwaysConstant () { - return false; - } - - isConstant () { - return false; - } -} - -/** - * @implements {Input} - * @property {ConstantInput} constantValue The underlying value of the constantInput - * @property {() => true} isAlwaysConstant - */ -class ConstantInput { - /** - * @param {string|number|boolean} constantValue The constant value. - * @param {boolean} safe Whether the constant value is safe to use. - */ - constructor (constantValue, safe) { - this.constantValue = constantValue; - this.safe = safe; - this.source = `${constantValue}`; - this._cacheVar = null; - - this.type = TYPES.UNKNOWN; - if (Number.isFinite(constantValue)) { - this.type = getNumberInputType(constantValue); - } else if (typeof constantValue === 'string') { - this.type = TYPES.STRING; - } else if (typeof constantValue === 'boolean') { - this.type = TYPES.BOOLEAN; - } else if (Number.isNaN(this.constantValue)) { - this.type = TYPES.NUMBER_NAN; - } - } - - isAlwaysType (type) { - return (this.type & type) === this.type; - } - - isSometimesType (type) { - return (this.type & type) !== 0; - } - - asNumber () { - // Compute at compilation time - const numberValue = +this.constantValue; - if (numberValue) { - // It's important that we use the number's stringified value and not the constant value - // Using the constant value allows numbers such as "010" - // to be interpreted as 8 (or SyntaxError in strict mode) instead of 10. - return numberValue.toString(); - } - // numberValue is one of 0, -0, or NaN - if (Object.is(numberValue, -0)) { - return '-0'; - } - return '0'; - } - - asJSON () { - return `parseJSON(${this.asUnknown()})`; - } - - asInt () { - if (this.isAlwaysInt()) { - return this.asNumber(); - } - return `${+this.constantValue | 0}`; - } - - asNumberOrNaN () { - return this.asNumber(); - } - - asString () { - return `"${sanitize(`${this.constantValue}`)}"`; - } - - asStringOrEmpty () { - return this.asString(); - } - - asLowerString () { - return `"${sanitize(`${this.constantValue}`).toLowerCase()}"`; - } - - asBoolean () { - // Compute at compilation time - return Cast.toBoolean(this.constantValue).toString(); - } - - asColor () { - // Attempt to parse hex code at compilation time - const strConst = `${this.constantValue}`; - if (/^#[0-9a-f]{6,8}$/i.test(strConst)) { - const hex = strConst.substr(1); - return Number.parseInt(hex, 16).toString(); - } - return this.asUnknown(); - } - - asUnknown () { - if (typeof this.constantValue === 'boolean') { - return this.constantValue ? 'true' : 'false'; - } - // Attempt to convert strings to numbers if it is unlikely to break things - if (typeof this.constantValue === 'number') { - // todo: handle NaN? - if (Number.isNaN(this.constantValue)) return NaN; - return `${this.constantValue}`; - } - const numberValue = +this.constantValue; - if (numberValue.toString() === this.constantValue) { - return `${this.constantValue}`; - } - return this.asString(); - } - - isSafe () { - if (typeof this.constantValue === 'boolean') { - return true; - } - if (Number.isFinite(this.constantValue)) { - return true; - } - return this.safe; - } - - asSafe () { - if (this.isSafe()) { - return this.asUnknown(); - } - return this.asString(); - } - - isAlwaysNumber () { - const value = +this.constantValue; - if (Number.isNaN(value)) { - return false; - } - // Empty strings evaluate to 0 but should not be considered a number. - if (value === 0) { - return this.constantValue.toString().trim() !== ''; - } - return true; - } - - isAlwaysInt () { - const strConst = `${this.constantValue}`; - if (strConst === '0') return false; - return strConst === `${(this.constantValue | 0)}`; - } - - isAlwaysNumberOrNaN () { - return this.isAlwaysNumber(); - } - - isNeverNumber () { - return Number.isNaN(+this.constantValue); - } - - isAlwaysFinite () { - if (this.constantValue === '') return false; - const value = +this.constantValue; - if (Number.isNaN(value)) { - return false; - } - if (Math.abs(value) === Infinity) { - return false; - } - return true; - } - - isAlwaysConstant () { - return true; - } - - /** - * @param {ConstantValue} testValue - * @returns {boolean} - */ - isConstant (testValue) { - const val = this.constantValue; - if (val === '') return false; - if (+testValue === 0) { - if (Object.is(+val, -0)) { - return false; - } - } - if (this.isAlwaysNumber()) { - return +val === +testValue; - } - return val === testValue; - } -} - -/** - * @implements {Input} - */ -class VariableInput { - /** - * @param {string} source The source code for this input. - */ - constructor (source) { - this.source = source; - this.type = TYPES.UNKNOWN; - this._cacheVar = null; - this._generator = CURRENT_GENERATOR; - this._lastLinePos = -1; - /** - * The value this variable was most recently set to, if any. - * @type {Input} - * @private - */ - this._value = null; - } - - /** - * @param {Input} input The input this variable was most recently set to. - */ - setInput (input) { - if (input instanceof VariableInput) { - // When being set to another variable, extract the value it was set to. - // Otherwise, you may end up with infinite recursion in analysis methods when a variable is set to itself. - if (input._value) { - input = input._value; - } else { - this.type = TYPES.UNKNOWN; - this._value = null; - return; - } - } - this._value = input; - if (Object.hasOwn(input, 'constantValue')) { - this.constantValue = input.constantValue; - } - if (input instanceof TypedInput || input instanceof ConstantInput) { - this.type = input.type; - } else { - this.type = TYPES.UNKNOWN; - } - if (this._generator) { - this._generator.setVariableType(this.source, this.type); - } - } - - isAlwaysType (type) { - return (this.type & type) === this.type; - } - - isSometimesType (type) { - return (this.type & type) !== 0; - } - - asNumber () { - if (this.isSometimesType(TYPES.JSON)) return `toNotNaN(+toScratchString(${this.source}))`; - if (this.isAlwaysType(TYPES.NUMBER)) return this.source; - if (this.isAlwaysType(TYPES.NUMBER_OR_NAN)) return `toNotNaN(${this.source})`; - return `toNotNaN(+${this.source})`; - } - - asInt () { - if (this.isSometimesType(TYPES.JSON)) return `(+toScratchString(${this.source}) | 0)`; - if (this.isAlwaysType(TYPES.NUMBER_INT)) return this.source; - if (this.isAlwaysType(TYPES.NUMBER_OR_NAN)) return `(${this.source} | 0)`; - return `(+${this.source} | 0)`; - } - - asNumberOrNaN () { - if (this.isSometimesType(TYPES.JSON)) return `(+toScratchString(${this.source}))`; - if (this.isAlwaysType(TYPES.NUMBER_OR_NAN)) return this.source; - return `(+${this.source})`; - } - - asString () { - if (this.isSometimesType(TYPES.JSON)) return `toScratchString(${this.source})`; - if (this.isAlwaysType(TYPES.STRING)) return this.source; - return `("" + ${this.source})`; - } - - asStringOrEmpty () { - if (this.isSometimesType(TYPES.JSON)) return `toScratchString(${this.source})`; - if (this.isAlwaysType(TYPES.STRING)) return this.source; - return `("" + ${this.source})`; - } - - asLowerString () { - if (this.isSometimesType(TYPES.JSON)) return `toScratchString(${this.source}).toLowerCase()`; - if (this.isAlwaysType(TYPES.LOWER_STRING)) return this.source; - return `("" + ${this.source}).toLowerCase()`; - } - - asBoolean () { - if (this.isAlwaysType(TYPES.BOOLEAN)) return this.source; - return `toBoolean(${this.source})`; - } - - asJSON () { - if (this.isAlwaysType(TYPES.JSON)) return this.source; - return `parseJSON(${this.source})`; - } - - asColor () { - return this.asUnknown(); - } - - asUnknown () { - if (this.isSometimesType(TYPES.JSON) && this.isAlwaysType(TYPES.JSON_VALUE)) { - return `toScratchValue(${this.source})`; - } - return this.source; - } - - isSafe () { - return true; - } - - asSafe () { - return this.asUnknown(); - } - - isAlwaysNumber () { - if (this._value) { - return this._value.isAlwaysNumber(); - } - return false; - } - - isAlwaysInt () { - if (this._value) { - return this._value.isAlwaysInt(); - } - return false; - } - - isAlwaysNumberOrNaN () { - if (this._value) { - return this._value.isAlwaysNumberOrNaN(); - } - return false; - } - - isNeverNumber () { - if (this._value) { - return this._value.isNeverNumber(); - } - return false; - } - - isAlwaysFinite () { - if (this._value) { - return this._value.isAlwaysFinite(); - } - return false; - } - - isAlwaysConstant () { - if (this._value) { - return this._value.isAlwaysConstant(); - } - return false; - } - - /** - * @param {ConstantValue} testValue - * @returns {boolean} - */ - isConstant (testValue) { - if (this._value) { - return this._value.isConstant(testValue); - } - return false; - } -} - -module.exports = {TypedInput, ConstantInput, VariableInput, setCurrentGenerator}; diff --git a/src/compiler/intermediate.js b/src/compiler/intermediate.js index 862bd32a46d..2a663145651 100644 --- a/src/compiler/intermediate.js +++ b/src/compiler/intermediate.js @@ -1,9 +1,268 @@ // @ts-check +const Cast = require('../util/cast'); +const {InputOpcode, InputType} = require('./enums.js'); +const log = require('../util/log'); + /** * @fileoverview Common intermediates shared amongst parts of the compiler. */ +/** + * Describes a 'stackable' block (eg. show) + */ +class IntermediateStackBlock { + /** + * @param {import("./enums").StackOpcode} opcode + * @param {Object} inputs + * @param {boolean} yields + */ + constructor (opcode, inputs = {}, yields = false) { + /** + * The type of the stackable block. + * @type {import("./enums").StackOpcode} + */ + this.opcode = opcode; + + /** + * The inputs of this block. + * @type {Object} + */ + this.inputs = inputs; + + /** + * Does this block cause a yield + * @type {boolean} + */ + this.yields = yields; + + /** + * Should state changes made by this stack block be ignored? Used for testing. + * @type {boolean} + */ + this.ignoreState = false; + + /** + * @type {import("./iroptimizer").TypeState?} + */ + this.entryState = null; + + /** + * @type {import("./iroptimizer").TypeState?} + */ + this.exitState = null; + } +} + +/** + * Describes an input to a block. + * This could be a constant, variable or math operation. + */ +class IntermediateInput { + + static getNumberInputType (number) { + if (typeof number !== 'number') throw new Error('Expected a number.'); + if (number === Infinity) return InputType.NUMBER_POS_INF; + if (number === -Infinity) return InputType.NUMBER_NEG_INF; + if (number < 0) return Number.isInteger(number) ? InputType.NUMBER_NEG_INT : InputType.NUMBER_NEG_FRACT; + if (number > 0) return Number.isInteger(number) ? InputType.NUMBER_POS_INT : InputType.NUMBER_POS_FRACT; + if (Number.isNaN(number)) return InputType.NUMBER_NAN; + if (Object.is(number, -0)) return InputType.NUMBER_NEG_ZERO; + return InputType.NUMBER_ZERO; + } + + /** + * @param {InputOpcode} opcode + * @param {InputType} type + * @param {Object} inputs + * @param {boolean} yields + */ + constructor (opcode, type, inputs = {}, yields = false) { + /** + * @type {InputOpcode} + */ + this.opcode = opcode; + + /** + * @type {InputType} + */ + this.type = type; + + /** + * @type {Object} + */ + this.inputs = inputs; + + /** + * @type {boolean} + */ + this.yields = yields; + } + + /** + * Is this input a constant whos value equals value. + * @param {*} value The value + * @returns {boolean} + */ + isConstant (value) { + if (this.opcode !== InputOpcode.CONSTANT) return false; + let equal = this.inputs.value === value; + if (!equal && typeof value === 'number') equal = (+this.inputs.value) === value; + return equal; + } + + /** + * Is the type of this input guaranteed to always be the type at runtime. + * @param {InputType} type + * @returns {boolean} + */ + isAlwaysType (type) { + return (this.type & type) === this.type; + } + + /** + * Is it possible for this input to be the type at runtime. + * @param {InputType} type + * @returns + */ + isSometimesType (type) { + return (this.type & type) !== 0; + } + + /** + * Converts this input to a target type. + * If this input is a constant the conversion is performed now, at compile time. + * If the input changes, the conversion is performed at runtime. + * @param {InputType} targetType + * @returns {IntermediateInput} An input with the new type. + */ + toType (targetType) { + let castOpcode; + switch (targetType) { + case InputType.BOOLEAN: + castOpcode = InputOpcode.CAST_BOOLEAN; + break; + case InputType.NUMBER: + castOpcode = InputOpcode.CAST_NUMBER; + break; + case InputType.NUMBER_INDEX: + castOpcode = InputOpcode.CAST_NUMBER_INDEX; + break; + case InputType.NUMBER_OR_NAN: + castOpcode = InputOpcode.CAST_NUMBER_OR_NAN; + break; + case InputType.STRING: + castOpcode = InputOpcode.CAST_STRING; + break; + case InputType.COLOR: + castOpcode = InputOpcode.CAST_COLOR; + break; + default: + log.warn(`Cannot cast to type: ${targetType}`, this); + throw new Error(`Cannot cast to type: ${targetType}`); + } + + if (this.isAlwaysType(targetType)) return this; + + if (this.opcode === InputOpcode.CONSTANT) { + // If we are a constant, we can do the cast here at compile time + switch (castOpcode) { + case InputOpcode.CAST_BOOLEAN: + this.inputs.value = Cast.toBoolean(this.inputs.value); + this.type = InputType.BOOLEAN; + break; + case InputOpcode.CAST_NUMBER: + case InputOpcode.CAST_NUMBER_INDEX: + case InputOpcode.CAST_NUMBER_OR_NAN: { + if (this.isAlwaysType(InputType.BOOLEAN_INTERPRETABLE)) { + this.type = InputType.NUMBER; + this.inputs.value = +Cast.toBoolean(this.inputs.value); + } + const numberValue = +this.inputs.value; + if (numberValue) { + this.inputs.value = numberValue; + } else /* numberValue is one of 0, -0, or NaN */ if (Object.is(numberValue, -0)) { + this.inputs.value = -0; + } else { + this.inputs.value = 0; // Convert NaN to 0 + } + if (castOpcode === InputOpcode.CAST_NUMBER_INDEX) { + // Round numberValue to an integer + this.inputs.value |= 0; + } + this.type = IntermediateInput.getNumberInputType(this.inputs.value); + break; + } + case InputOpcode.CAST_STRING: + this.inputs.value += ''; + this.type = InputType.STRING; + break; + case InputOpcode.CAST_COLOR: + this.inputs.value = Cast.toRgbColorList(this.inputs.value); + this.type = InputType.COLOR; + break; + } + return this; + } + + return new IntermediateInput(castOpcode, targetType, {target: this}); + } +} + + +/** + * @param {InputType} type + * @returns {string} + */ +const stringifyType = type => { + let formatFlags = []; + + for (const enumValue in InputType) { + const testFormat = InputType[enumValue]; + + if ((testFormat & type) === testFormat) { + for (const existingFormat of formatFlags) { + if ((testFormat & InputType[existingFormat]) === testFormat) { + continue; + } + } + + formatFlags = formatFlags.filter(value => (InputType[value] & testFormat) !== InputType[value]); + formatFlags.push(enumValue); + } + } + + let str = null; + + for (const formatFlag of formatFlags) { + if (str === null) { + str = formatFlag; + } else { + str = `${str} | ${formatFlag}`; + } + } + + if (str === null) { + return 'INVALID'; + } + + return str; +}; + +/** + * A 'stack' of blocks, like the contents of a script or the inside + * of a C block. + */ +class IntermediateStack { + /** + * @param {IntermediateStackBlock[]} [blocks] + */ + constructor (blocks) { + /** @type {IntermediateStackBlock[]} */ + this.blocks = blocks ?? []; + } +} + /** * An IntermediateScript describes a single script. * Scripts do not necessarily have hats. @@ -18,7 +277,7 @@ class IntermediateScript { /** * List of nodes that make up this script. - * @type {Array|null} + * @type {IntermediateStack?} */ this.stack = null; @@ -68,7 +327,6 @@ class IntermediateScript { /** * List of procedure IDs that this script needs. - * @type {Array} * @readonly */ this.dependedProcedures = []; @@ -79,11 +337,18 @@ class IntermediateScript { */ this.cachedCompileResult = null; + /** + * Cached result of analysing this script. + * @type {import("./iroptimizer").TypeState|null} + */ + this.cachedAnalysisEndState = null; + /** * Whether the top block of this script is an executable hat. * @type {boolean} */ this.executableHat = false; + } } @@ -92,12 +357,14 @@ class IntermediateScript { */ class IntermediateRepresentation { /** - * @param {IntermediateScript|null} [entry] + * + * @param {IntermediateScript} entry + * @param {Object.} procedures */ - constructor (entry = null) { + constructor (entry, procedures) { /** * The entry point of this IR. - * @type {IntermediateScript|null} + * @type {IntermediateScript} */ this.entry = entry; @@ -105,11 +372,24 @@ class IntermediateRepresentation { * Maps procedure variants to their intermediate script. * @type {Object.} */ - this.procedures = {}; + this.procedures = procedures; + } + + /** + * Gets the first procedure with the given proccode. + * @param {string} proccode + * @returns {IntermediateScript | undefined} + */ + getProcedure (proccode) { + return Object.values(this.procedures).find(procedure => procedure.procedureCode === proccode); } } module.exports = { + IntermediateStackBlock, + IntermediateInput, + IntermediateStack, IntermediateScript, - IntermediateRepresentation + IntermediateRepresentation, + stringifyType }; diff --git a/src/compiler/irgen.js b/src/compiler/irgen.js index b6303a0dd89..921f6a585f5 100644 --- a/src/compiler/irgen.js +++ b/src/compiler/irgen.js @@ -5,64 +5,58 @@ const StringUtil = require('../util/string-util'); const BlockType = require('../extension-support/block-type'); const Variable = require('../engine/variable'); const log = require('../util/log'); -const {IntermediateScript, IntermediateRepresentation} = require('./intermediate'); const compatBlocks = require('./compat-blocks'); -const compiledExtensions = require('./extensions'); - -const {BLOCKS} = require('./enums'); - -// eslint-disable-next-line no-unused-vars -const Thread = require('../engine/thread.js'); - -/** - * @typedef {import('./jsgen.js').node} node - */ +const {StackOpcode, InputOpcode, InputType} = require('./enums.js'); +const { + IntermediateStackBlock, + IntermediateInput, + IntermediateStack, + IntermediateScript, + IntermediateRepresentation +} = require('./intermediate'); +const oldCompilerCompatiblity = require('./old-compiler-compatibility.js'); /** * @fileoverview Generate intermediate representations from Scratch blocks. */ +/* eslint-disable max-len */ const SCALAR_TYPE = ''; const LIST_TYPE = 'list'; - -/** - * Whether a constant `=` operand can be a case label in a numeric switch. - * Letters are rejected because Scratch compares a non-numeric subject against the label as a - * lowercased string, so labels like "Infinity" or "1e3" would match subjects ("INFINITY") that - * a numeric switch cannot. Without letters, only a numeric subject can ever match. - * @param {*} value The constant operand - * @returns {boolean} true if the value is safe to use as a numeric case label - */ -const isSwitchNumberLabel = value => { - const str = `${value}`; - if (str.trim() === '' || /[a-z]/i.test(str)) return false; - return !Number.isNaN(Number(str)); +const COMPILER_INPUT_TYPES = { + any: InputType.ANY, + number: InputType.NUMBER, + numberOrNaN: InputType.NUMBER_OR_NAN, + string: InputType.STRING, + boolean: InputType.BOOLEAN }; +const RAW_SOURCE_COMMANDS = new Set([ + 'mistsutils_patchcommand', + 'mistsutils_patchcommand2', + 'mistsutils_patchcommand3', + 'patching_jscommand', + 'patching_jscommand2', + 'patching_jscommand3' +]); +const RAW_SOURCE_REPORTERS = new Map([ + ['mistsutils_patchreporter', InputType.ANY], + ['mistsutils_patchreporter2', InputType.ANY], + ['mistsutils_patchreporter3', InputType.ANY], + ['mistsutils_patchboolean', InputType.BOOLEAN], + ['patching_jsreporter', InputType.ANY], + ['patching_jsreporter2', InputType.ANY], + ['patching_jsreporter3', InputType.ANY], + ['patching_jsboolean', InputType.BOOLEAN] +]); /** - * Whether a constant `=` operand can be a case label in a string switch. Scratch always compares - * a non-numeric label as a lowercased string, so such labels are always safe. - * @param {*} value The constant operand - * @returns {boolean} true if the value is safe to use as a string case label + * @typedef DescendedVariable + * @property {'target'|'stage'} scope + * @property {string | null} id + * @property {string} name + * @property {boolean} isCloud */ -const isSwitchStringLabel = value => { - const str = `${value}`; - return str.trim() === '' || Number.isNaN(Number(str)); -}; - -/** - * Create a variable codegen object. - * @param {'target'|'stage'} scope The scope of this variable -- which object owns it. - * @param {import('../engine/variable.js')} varObj The Scratch Variable - * @returns {*} A variable codegen object. - */ -const createVariableData = (scope, varObj) => ({ - scope, - id: varObj.id, - name: varObj.name, - isCloud: varObj.isCloud -}); /** * @param {string} code @@ -89,14 +83,8 @@ const parseProcedureCode = variant => variant.substring(1); const parseIsWarp = variant => variant.charAt(0) === 'W'; class ScriptTreeGenerator { - /** - * @param {Thread} thread - */ constructor (thread) { - /** The main thread being compiled. - * @private - * @type {Thread} - */ + /** @private */ this.thread = thread; /** @private */ this.target = thread.target; @@ -121,13 +109,27 @@ class ScriptTreeGenerator { this.variableCache = {}; this.usesTimer = false; + + this.namesOfCostumesAndSounds = new Set(); + for (const target of this.runtime.targets) { + if (target.isOriginal) { + const sprite = target.sprite; + for (const costume of sprite.costumes) { + this.namesOfCostumesAndSounds.add(costume.name); + } + for (const sound of sprite.sounds) { + this.namesOfCostumesAndSounds.add(sound.name); + } + } + } + + this.oldCompilerStub = ( + oldCompilerCompatiblity.enabled ? + new oldCompilerCompatiblity.ScriptTreeGeneratorStub(this) : + null + ); } - /** - * @param {string} procedureVariant - * @throws {Error} if the procedure cannot be found - * @returns {void} - */ setProcedureVariant (procedureVariant) { const procedureCode = parseProcedureCode(procedureVariant); @@ -149,118 +151,139 @@ class ScriptTreeGenerator { this.script.isWarp = true; } - /** - * @param {string} blockId - * @returns {any} - */ getBlockById (blockId) { // Flyout blocks are stored in a special container. return this.blocks.getBlock(blockId) || this.blocks.runtime.flyoutBlocks.getBlock(blockId); } - /** - * @param {string} fullOpcode - * @returns {blockInfo|null} - */ getBlockInfo (fullOpcode) { const [category, opcode] = StringUtil.splitFirst(fullOpcode, '_'); if (!category || !opcode) { return null; } - const categoryInfo = this.runtime._blockInfo - .find(/** @param {blockInfo} ci */ ci => ci.id === category); - + const categoryInfo = this.runtime._blockInfo.find(ci => ci.id === category); if (!categoryInfo) { return null; } - const blockInfo = categoryInfo.blocks - .find(/** @param {blockInfo} b */ b => b.info.opcode === opcode); - + const blockInfo = categoryInfo.blocks.find(b => b.info.opcode === opcode); if (!blockInfo) { return null; } return blockInfo; } + createConstantInput (constant, preserveStrings = false) { + if (constant === null) throw new Error('IR: Constant cannot have a null value.'); + + constant += ''; + const numConstant = +constant; + const preserve = preserveStrings && this.namesOfCostumesAndSounds.has(constant); + + if (!Number.isNaN(numConstant) && (constant.trim() !== '' || constant.includes('\t'))) { + if (!preserve && numConstant.toString() === constant) { + return new IntermediateInput(InputOpcode.CONSTANT, IntermediateInput.getNumberInputType(numConstant), {value: numConstant}); + } + return new IntermediateInput(InputOpcode.CONSTANT, InputType.STRING_NUM, {value: constant}); + } + + if (!preserve) { + if (constant === 'true') { + return new IntermediateInput(InputOpcode.CONSTANT, InputType.STRING_BOOLEAN, {value: constant}); + } else if (constant === 'false') { + return new IntermediateInput(InputOpcode.CONSTANT, InputType.STRING_BOOLEAN, {value: constant}); + } + } + + return new IntermediateInput(InputOpcode.CONSTANT, InputType.STRING_NAN, {value: constant}); + } + /** * Descend into a child input of a block. (eg. the input STRING of "length of ( )") * @param {*} parentBlock The parent Scratch block that contains the input. * @param {string} inputName The name of the input to descend into. + * @param {boolean} preserveStrings Should this input keep the names of costumes and sounds at strings. * @private - * @returns {node} Compiled input node for this input. + * @returns {IntermediateInput} Compiled input node for this input. */ - descendInputOfBlock (parentBlock, inputName) { + descendInputOfBlock (parentBlock, inputName, preserveStrings = false) { const input = parentBlock.inputs[inputName]; if (!input) { log.warn(`IR: ${parentBlock.opcode}: missing input ${inputName}`, parentBlock); - return { - kind: BLOCKS.CONSTANT, - value: 0 - }; + return this.createConstantInput(0); } const inputId = input.block; const block = this.getBlockById(inputId); if (!block) { log.warn(`IR: ${parentBlock.opcode}: could not find input ${inputName} with ID ${inputId}`); - return { - kind: BLOCKS.CONSTANT, - value: 0 - }; + return this.createConstantInput(0); } - return this.descendInput(block); + const intermediate = this.descendInput(block, preserveStrings); + this.script.yields = this.script.yields || intermediate.yields; + return intermediate; } - descendVariadicOperator (block, prefix, kind) { - const mutation = block.mutation; - let count = 2; - if (mutation && mutation.itemcount) { - const parsed = parseInt(mutation.itemcount, 10); - if (parsed >= 2) count = parsed; - } - let node = { - kind, - left: this.descendInputOfBlock(block, `${prefix}1`), - right: this.descendInputOfBlock(block, `${prefix}2`) - }; + /** + * Compile MistWarp's extendable operators as nested native operations. + * @param {*} block Operator block. + * @param {string} prefix Input name prefix. + * @param {string} opcode IR opcode. + * @param {number} resultType Result type. + * @param {number} inputType Operand type. + * @returns {IntermediateInput} + */ + descendVariadicOperator (block, prefix, opcode, resultType, inputType) { + const parsedCount = Number.parseInt(block.mutation?.itemcount, 10); + const count = parsedCount >= 2 ? parsedCount : 2; + let result = new IntermediateInput(opcode, resultType, { + left: this.descendInputOfBlock(block, `${prefix}1`).toType(inputType), + right: this.descendInputOfBlock(block, `${prefix}2`).toType(inputType) + }); for (let i = 3; i <= count; i++) { - node = { - kind, - left: node, - right: this.descendInputOfBlock(block, `${prefix}${i}`) - }; + result = new IntermediateInput(opcode, resultType, { + left: result.toType(inputType), + right: this.descendInputOfBlock(block, `${prefix}${i}`).toType(inputType) + }); } - return node; + return result; } /** * Descend into an input. (eg. "length of ( )") * @param {*} block The parent Scratch block input. + * @param {boolean} preserveStrings Should this input keep the names of costumes and sounds at strings. * @private - * @returns {node} Compiled input node for this input. + * @returns {IntermediateInput} Compiled input node for this input. */ - descendInput (block) { + descendInput (block, preserveStrings = false) { + const rawSourceType = RAW_SOURCE_REPORTERS.get(block.opcode); + if (rawSourceType) { + return this.descendRawSourceInput(block, rawSourceType); + } + + const compilerExtension = this.runtime.compilerExtensions.get(block.opcode); + if (compilerExtension && compilerExtension.type !== 'command') { + return this.descendCompilerExtensionInput(block, compilerExtension); + } + + if (this.oldCompilerStub) { + const oldCompilerResult = this.oldCompilerStub.descendInputFromNewCompiler(block); + if (oldCompilerResult) { + return oldCompilerResult; + } + } + switch (block.opcode) { case 'colour_picker': - return { - kind: BLOCKS.CONSTANT, - value: block.fields.COLOUR.value - }; + return this.createConstantInput(block.fields.COLOUR.value, true); case 'math_angle': case 'math_integer': case 'math_number': case 'math_positive_number': case 'math_whole_number': - return { - kind: BLOCKS.CONSTANT, - value: block.fields.NUM.value - }; + return this.createConstantInput(block.fields.NUM.value, preserveStrings); case 'text': - return { - kind: BLOCKS.CONSTANT, - value: block.fields.TEXT.value - }; - + return this.createConstantInput(block.fields.TEXT.value, preserveStrings); case 'argument_reporter_string_number': { const name = block.fields.VALUE.value; // lastIndexOf because multiple parameters with the same name will use the value of the last definition @@ -268,541 +291,392 @@ class ScriptTreeGenerator { if (index === -1) { // Legacy support if (name.toLowerCase() === 'last key pressed') { - return { - kind: BLOCKS.TW.LAST_KEY_PRESSED - }; + return new IntermediateInput(InputOpcode.TW_KEY_LAST_PRESSED, InputType.STRING); } } if (index === -1) { - return { - kind: BLOCKS.CONSTANT, - value: 0 - }; + return this.createConstantInput(0); } - return { - kind: BLOCKS.PROCEDURES.ARGUMENT, - index: index - }; + return new IntermediateInput(InputOpcode.PROCEDURE_ARGUMENT, InputType.ANY, {index}); } case 'argument_reporter_boolean': { // see argument_reporter_string_number above const name = block.fields.VALUE.value; const index = this.script.arguments.lastIndexOf(name); if (index === -1) { - /** @param {string} input */ - const normalizeValue = input => { - const lowered = String(input) - .toLowerCase() - .trim() - .replace(/\s+/g, ' '); - return lowered.endsWith('?') ? lowered.slice(0, -1).trim() : lowered; - }; - - const normalizedName = normalizeValue(name); - if (normalizedName === 'is compiled' || - normalizedName === 'is turbowarp' || - normalizedName === 'is mistwarp') { - return { - kind: BLOCKS.CONSTANT, - value: true - }; + if (name.toLowerCase() === 'is compiled?' || name.toLowerCase() === 'is turbowarp?') { + return this.createConstantInput(true).toType(InputType.BOOLEAN); } - return { - kind: BLOCKS.CONSTANT, - value: 0 - }; + return this.createConstantInput(0); } - return { - kind: BLOCKS.PROCEDURES.ARGUMENT, - index: index - }; + return new IntermediateInput(InputOpcode.PROCEDURE_ARGUMENT, InputType.ANY, {index}); } - case 'control_get_counter': - return { - kind: BLOCKS.COUNTER.GET - }; - case 'data_variable': - return { - kind: BLOCKS.VAR.GET, + return new IntermediateInput(InputOpcode.VAR_GET, InputType.ANY, { variable: this.descendVariable(block, 'VARIABLE', SCALAR_TYPE) - }; + }); case 'data_itemoflist': - return { - kind: BLOCKS.LIST.GET, + return new IntermediateInput(InputOpcode.LIST_GET, InputType.ANY, { list: this.descendVariable(block, 'LIST', LIST_TYPE), index: this.descendInputOfBlock(block, 'INDEX') - }; + }); case 'data_lengthoflist': - return { - kind: BLOCKS.LIST.LENGTH, + return new IntermediateInput(InputOpcode.LIST_LENGTH, InputType.NUMBER_POS_INT | InputType.NUMBER_ZERO, { list: this.descendVariable(block, 'LIST', LIST_TYPE) - }; + }); case 'data_listcontainsitem': - return { - kind: BLOCKS.LIST.CONTAINS, + return new IntermediateInput(InputOpcode.LIST_CONTAINS, InputType.BOOLEAN, { list: this.descendVariable(block, 'LIST', LIST_TYPE), item: this.descendInputOfBlock(block, 'ITEM') - }; + }); case 'data_itemnumoflist': - return { - kind: BLOCKS.LIST.INDEXOF, + return new IntermediateInput(InputOpcode.LIST_INDEX_OF, InputType.NUMBER_POS_INT | InputType.NUMBER_ZERO, { list: this.descendVariable(block, 'LIST', LIST_TYPE), item: this.descendInputOfBlock(block, 'ITEM') - }; + }); case 'data_listcontents': - return { - kind: BLOCKS.LIST.CONTENTS, + return new IntermediateInput(InputOpcode.LIST_CONTENTS, InputType.STRING, { list: this.descendVariable(block, 'LIST', LIST_TYPE) - }; + }); case 'data_get_list_as': - return { - kind: BLOCKS.LIST.AS, + return new IntermediateInput(InputOpcode.LIST_AS, InputType.STRING, { list: this.descendVariable(block, 'LIST', LIST_TYPE), - format: block.fields.FORMAT.value - }; + format: block.fields.FORMAT?.value || block.fields.TYPE?.value || 'JSON' + }); + case 'event_broadcast_menu': { const broadcastOption = block.fields.BROADCAST_OPTION; const broadcastVariable = this.target.lookupBroadcastMsg(broadcastOption.id, broadcastOption.value); // TODO: empty string probably isn't the correct fallback const broadcastName = broadcastVariable ? broadcastVariable.name : ''; - return { - kind: BLOCKS.CONSTANT, - value: broadcastName - }; + return this.createConstantInput(broadcastName); } case 'looks_backdropnumbername': if (block.fields.NUMBER_NAME.value === 'number') { - return { - kind: BLOCKS.LOOKS.BACKDROP_NUMBER - }; + return new IntermediateInput(InputOpcode.LOOKS_BACKDROP_NUMBER, InputType.NUMBER_POS_INT); } - return { - kind: BLOCKS.LOOKS.BACKDROP_NAME - }; + return new IntermediateInput(InputOpcode.LOOKS_BACKDROP_NAME, InputType.STRING); case 'looks_costumenumbername': if (block.fields.NUMBER_NAME.value === 'number') { - return { - kind: BLOCKS.LOOKS.COSTUME_NUMBER - }; + return new IntermediateInput(InputOpcode.LOOKS_COSTUME_NUMBER, InputType.NUMBER_POS_INT); } - return { - kind: BLOCKS.LOOKS.COSTUME_NAME - }; - case 'looks_costumes': - return { - kind: BLOCKS.LOOKS.COSTUMES - }; + return new IntermediateInput(InputOpcode.LOOKS_COSTUME_NAME, InputType.STRING); case 'looks_size': - return { - kind: BLOCKS.LOOKS.SIZE - }; + return new IntermediateInput(InputOpcode.LOOKS_SIZE_GET, InputType.NUMBER_POS | InputType.NUMBER_ZERO); + case 'looks_costumes': + return new IntermediateInput(InputOpcode.LOOKS_COSTUMES, InputType.STRING); case 'motion_direction': - return { - kind: BLOCKS.MOTION.DIRECTION - }; + return new IntermediateInput(InputOpcode.MOTION_DIRECTION_GET, InputType.NUMBER_REAL); case 'motion_xposition': - return { - kind: BLOCKS.MOTION.X_POSITION - }; + return new IntermediateInput(InputOpcode.MOTION_X_GET, InputType.NUMBER); case 'motion_yposition': - return { - kind: BLOCKS.MOTION.Y_POSITION - }; + return new IntermediateInput(InputOpcode.MOTION_Y_GET, InputType.NUMBER); case 'operator_add': - return this.descendVariadicOperator(block, 'NUM', BLOCKS.OP.ADD); + return this.descendVariadicOperator( + block, 'NUM', InputOpcode.OP_ADD, InputType.NUMBER_OR_NAN, InputType.NUMBER + ); case 'operator_and': - return this.descendVariadicOperator(block, 'OPERAND', BLOCKS.OP.AND); + return this.descendVariadicOperator( + block, 'OPERAND', InputOpcode.OP_AND, InputType.BOOLEAN, InputType.BOOLEAN + ); case 'operator_contains': - return { - kind: BLOCKS.OP.CONTAINS, - string: this.descendInputOfBlock(block, 'STRING1'), - contains: this.descendInputOfBlock(block, 'STRING2') - }; - case 'operator_change_case': - return { - kind: BLOCKS.OP.CHANGECASE, - string: this.descendInputOfBlock(block, 'STRING'), - case: block.fields.CASE.value - }; + return new IntermediateInput(InputOpcode.OP_CONTAINS, InputType.BOOLEAN, { + string: this.descendInputOfBlock(block, 'STRING1').toType(InputType.STRING), + contains: this.descendInputOfBlock(block, 'STRING2').toType(InputType.STRING) + }); case 'operator_divide': - return this.descendVariadicOperator(block, 'NUM', BLOCKS.OP.DIVIDE); + return this.descendVariadicOperator( + block, 'NUM', InputOpcode.OP_DIVIDE, InputType.NUMBER_OR_NAN, InputType.NUMBER + ); case 'operator_equals': - return { - kind: BLOCKS.OP.EQUALS, + return new IntermediateInput(InputOpcode.OP_EQUALS, InputType.BOOLEAN, { left: this.descendInputOfBlock(block, 'OPERAND1'), right: this.descendInputOfBlock(block, 'OPERAND2') - }; + }); case 'operator_gt': - return { - kind: BLOCKS.OP.GREATER, + return new IntermediateInput(InputOpcode.OP_GREATER, InputType.BOOLEAN, { left: this.descendInputOfBlock(block, 'OPERAND1'), right: this.descendInputOfBlock(block, 'OPERAND2') - }; + }); case 'operator_join': - return this.descendVariadicOperator(block, 'STRING', BLOCKS.OP.JOIN); - case 'operator_index_of': - return { - kind: BLOCKS.OP.INDEXOF, - substring: this.descendInputOfBlock(block, 'SUBSTRING'), - string: this.descendInputOfBlock(block, 'STRING') - }; - case 'operator_letters_of': - return { - kind: BLOCKS.OP.LETTERSOF, - start: this.descendInputOfBlock(block, 'LETTER1'), - end: this.descendInputOfBlock(block, 'LETTER2'), - string: this.descendInputOfBlock(block, 'STRING') - }; + return this.descendVariadicOperator( + block, 'STRING', InputOpcode.OP_JOIN, InputType.STRING, InputType.STRING + ); case 'operator_length': - return { - kind: BLOCKS.OP.LENGTH, - string: this.descendInputOfBlock(block, 'STRING') - }; + return new IntermediateInput(InputOpcode.OP_LENGTH, InputType.NUMBER_POS_INT | InputType.NUMBER_ZERO, { + string: this.descendInputOfBlock(block, 'STRING').toType(InputType.STRING) + }); case 'operator_letter_of': - return { - kind: BLOCKS.OP.LETTEROF, - letter: this.descendInputOfBlock(block, 'LETTER'), - string: this.descendInputOfBlock(block, 'STRING') - }; + return new IntermediateInput(InputOpcode.OP_LETTER_OF, InputType.STRING, { + letter: this.descendInputOfBlock(block, 'LETTER').toType(InputType.NUMBER_INDEX), + string: this.descendInputOfBlock(block, 'STRING').toType(InputType.STRING) + }); + case 'operator_letters_of': + return new IntermediateInput(InputOpcode.OP_LETTERS_OF, InputType.STRING, { + start: this.descendInputOfBlock(block, 'LETTER1').toType(InputType.NUMBER), + end: this.descendInputOfBlock(block, 'LETTER2').toType(InputType.NUMBER), + string: this.descendInputOfBlock(block, 'STRING').toType(InputType.STRING) + }); + case 'operator_index_of': + return new IntermediateInput(InputOpcode.OP_INDEX_OF, InputType.NUMBER_WHOLE, { + substring: this.descendInputOfBlock(block, 'SUBSTRING').toType(InputType.STRING), + string: this.descendInputOfBlock(block, 'STRING').toType(InputType.STRING) + }); + case 'operator_change_case': + return new IntermediateInput(InputOpcode.OP_CHANGE_CASE, InputType.STRING, { + string: this.descendInputOfBlock(block, 'STRING').toType(InputType.STRING), + upper: block.fields.CASE.value === 'uppercase' + }); + case 'operator_repeat': + return new IntermediateInput(InputOpcode.OP_REPEAT, InputType.STRING, { + string: this.descendInputOfBlock(block, 'STRING').toType(InputType.STRING), + count: this.descendInputOfBlock(block, 'REPEAT').toType(InputType.NUMBER) + }); + case 'operator_replace': + return new IntermediateInput(InputOpcode.OP_REPLACE, InputType.STRING, { + substring: this.descendInputOfBlock(block, 'SUBSTRING').toType(InputType.STRING), + string: this.descendInputOfBlock(block, 'STRING').toType(InputType.STRING), + replacement: this.descendInputOfBlock(block, 'REPLACE').toType(InputType.STRING) + }); + case 'operator_trim': + return new IntermediateInput(InputOpcode.OP_TRIM, InputType.STRING, { + string: this.descendInputOfBlock(block, 'STRING').toType(InputType.STRING) + }); + case 'operator_pi': + return this.createConstantInput(Math.PI); + case 'operator_newline': + return this.createConstantInput('\n'); case 'operator_lt': - return { - kind: BLOCKS.OP.LESS, + return new IntermediateInput(InputOpcode.OP_LESS, InputType.BOOLEAN, { left: this.descendInputOfBlock(block, 'OPERAND1'), right: this.descendInputOfBlock(block, 'OPERAND2') - }; + }); case 'operator_mathop': { - const value = this.descendInputOfBlock(block, 'NUM'); + const value = this.descendInputOfBlock(block, 'NUM').toType(InputType.NUMBER); const operator = block.fields.OPERATOR.value.toLowerCase(); switch (operator) { - case 'abs': return { - kind: BLOCKS.OP.ABS, - value - }; - case 'floor': return { - kind: BLOCKS.OP.FLOOR, - value - }; - case 'ceiling': return { - kind: BLOCKS.OP.CEILING, - value - }; - case 'sqrt': return { - kind: BLOCKS.OP.SQRT, - value - }; - case 'sin': return { - kind: BLOCKS.OP.SIN, - value - }; - case 'cos': return { - kind: BLOCKS.OP.COS, - value - }; - case 'tan': return { - kind: BLOCKS.OP.TAN, - value - }; - case 'asin': return { - kind: BLOCKS.OP.ASIN, - value - }; - case 'acos': return { - kind: BLOCKS.OP.ACOS, - value - }; - case 'atan': return { - kind: BLOCKS.OP.ATAN, - value - }; - case 'ln': return { - kind: BLOCKS.OP.LN, - value - }; - case 'log': return { - kind: BLOCKS.OP.LOG, - value - }; - case 'e ^': return { - kind: BLOCKS.OP.EXP, - value - }; - case '10 ^': return { - kind: BLOCKS.OP.TENEXP, - value - }; - default: return { - kind: BLOCKS.CONSTANT, - value: 0 - }; + case 'abs': return new IntermediateInput(InputOpcode.OP_ABS, InputType.NUMBER_POS | InputType.NUMBER_ZERO, {value}); + case 'floor': return new IntermediateInput(InputOpcode.OP_FLOOR, InputType.NUMBER_INT | InputType.NUMBER_INF, {value}); + case 'ceiling': return new IntermediateInput(InputOpcode.OP_CEILING, InputType.NUMBER_INT | InputType.NUMBER_INF, {value}); + case 'sqrt': return new IntermediateInput(InputOpcode.OP_SQRT, InputType.NUMBER_OR_NAN, {value}); + case 'sin': return new IntermediateInput(InputOpcode.OP_SIN, InputType.NUMBER_OR_NAN, {value}); + case 'cos': return new IntermediateInput(InputOpcode.OP_COS, InputType.NUMBER_OR_NAN, {value}); + case 'tan': return new IntermediateInput(InputOpcode.OP_TAN, InputType.NUMBER_OR_NAN, {value}); + case 'asin': return new IntermediateInput(InputOpcode.OP_ASIN, InputType.NUMBER_OR_NAN, {value}); + case 'acos': return new IntermediateInput(InputOpcode.OP_ACOS, InputType.NUMBER_OR_NAN, {value}); + case 'atan': return new IntermediateInput(InputOpcode.OP_ATAN, InputType.NUMBER, {value}); + case 'ln': return new IntermediateInput(InputOpcode.OP_LOG_E, InputType.NUMBER_OR_NAN, {value}); + case 'log': return new IntermediateInput(InputOpcode.OP_LOG_10, InputType.NUMBER_OR_NAN, {value}); + case 'e ^': return new IntermediateInput(InputOpcode.OP_POW_E, InputType.NUMBER, {value}); + case '10 ^': return new IntermediateInput(InputOpcode.OP_POW_10, InputType.NUMBER, {value}); + default: return this.createConstantInput(0); } } case 'operator_mod': - return this.descendVariadicOperator(block, 'NUM', BLOCKS.OP.MOD); - case 'operator_pi': - return { - kind: BLOCKS.CONSTANT, - value: Math.PI - }; - case 'operator_newline': - return { - kind: BLOCKS.CONSTANT, - value: '\n' - }; + return this.descendVariadicOperator( + block, 'NUM', InputOpcode.OP_MOD, InputType.NUMBER_OR_NAN, InputType.NUMBER + ); case 'operator_multiply': - return this.descendVariadicOperator(block, 'NUM', BLOCKS.OP.MULTIPLY); + return this.descendVariadicOperator( + block, 'NUM', InputOpcode.OP_MULTIPLY, InputType.NUMBER_OR_NAN, InputType.NUMBER + ); case 'operator_not': - return { - kind: BLOCKS.OP.NOT, - operand: this.descendInputOfBlock(block, 'OPERAND') - }; + return new IntermediateInput(InputOpcode.OP_NOT, InputType.BOOLEAN, { + operand: this.descendInputOfBlock(block, 'OPERAND').toType(InputType.BOOLEAN) + }); case 'operator_or': - return this.descendVariadicOperator(block, 'OPERAND', BLOCKS.OP.OR); - case 'operator_repeat': - return { - kind: BLOCKS.OP.REPEAT, - string: this.descendInputOfBlock(block, 'STRING'), - count: this.descendInputOfBlock(block, 'REPEAT') - }; - case 'operator_replace': - return { - kind: BLOCKS.OP.REPLACE, - substring: this.descendInputOfBlock(block, 'SUBSTRING'), - string: this.descendInputOfBlock(block, 'STRING'), - replacement: this.descendInputOfBlock(block, 'REPLACE') - }; - case 'operator_trim': - return { - kind: BLOCKS.OP.TRIM, - string: this.descendInputOfBlock(block, 'STRING') - }; + return this.descendVariadicOperator( + block, 'OPERAND', InputOpcode.OP_OR, InputType.BOOLEAN, InputType.BOOLEAN + ); case 'operator_random': { const from = this.descendInputOfBlock(block, 'FROM'); const to = this.descendInputOfBlock(block, 'TO'); // If both values are known at compile time, we can do some optimizations. // TODO: move optimizations to jsgen? - if (from.kind === BLOCKS.CONSTANT && to.kind === BLOCKS.CONSTANT) { - const sFrom = from.value; - const sTo = to.value; + if (from.opcode === InputOpcode.CONSTANT && to.opcode === InputOpcode.CONSTANT) { + const sFrom = from.inputs.value; + const sTo = to.inputs.value; const nFrom = Cast.toNumber(sFrom); const nTo = Cast.toNumber(sTo); // If both numbers are the same, random is unnecessary. // todo: this probably never happens so consider removing if (nFrom === nTo) { - return { - kind: BLOCKS.CONSTANT, - value: nFrom - }; + return this.createConstantInput(nFrom); } // If both are ints, hint this to the compiler if (Cast.isInt(sFrom) && Cast.isInt(sTo)) { - return { - kind: BLOCKS.OP.RANDOM, - low: nFrom <= nTo ? from : to, - high: nFrom <= nTo ? to : from, + // Both inputs are ints, so we know neither are NaN + return new IntermediateInput(InputOpcode.OP_RANDOM, InputType.NUMBER, { + low: (nFrom <= nTo ? from : to).toType(InputType.NUMBER), + high: (nFrom <= nTo ? to : from).toType(InputType.NUMBER), useInts: true, useFloats: false - }; + }); } // Otherwise hint that these are floats - return { - kind: BLOCKS.OP.RANDOM, - low: nFrom <= nTo ? from : to, - high: nFrom <= nTo ? to : from, + return new IntermediateInput(InputOpcode.OP_RANDOM, InputType.NUMBER_OR_NAN, { + low: (nFrom <= nTo ? from : to).toType(InputType.NUMBER), + high: (nFrom <= nTo ? to : from).toType(InputType.NUMBER), useInts: false, useFloats: true - }; - } else if (from.kind === BLOCKS.CONSTANT) { + }); + } else if (from.opcode === InputOpcode.CONSTANT) { // If only one value is known at compile-time, we can still attempt some optimizations. - if (!Cast.isInt(Cast.toNumber(from.value))) { - return { - kind: BLOCKS.OP.RANDOM, - low: from, - high: to, + if (!Cast.isInt(Cast.toNumber(from.inputs.value))) { + return new IntermediateInput(InputOpcode.OP_RANDOM, InputType.NUMBER_OR_NAN, { + low: from.toType(InputType.NUMBER), + high: to.toType(InputType.NUMBER), useInts: false, useFloats: true - }; + }); } - } else if (to.kind === BLOCKS.CONSTANT) { - if (!Cast.isInt(Cast.toNumber(to.value))) { - return { - kind: BLOCKS.OP.RANDOM, - low: from, - high: to, + } else if (to.opcode === InputOpcode.CONSTANT) { + if (!Cast.isInt(Cast.toNumber(from.inputs.value))) { + return new IntermediateInput(InputOpcode.OP_RANDOM, InputType.NUMBER_OR_NAN, { + low: from.toType(InputType.NUMBER), + high: to.toType(InputType.NUMBER), useInts: false, useFloats: true - }; + }); } } // No optimizations possible - return { - kind: BLOCKS.OP.RANDOM, + return new IntermediateInput(InputOpcode.OP_RANDOM, InputType.NUMBER_OR_NAN, { low: from, high: to, useInts: false, useFloats: false - }; + }); } case 'operator_round': - return { - kind: BLOCKS.OP.ROUND, - value: this.descendInputOfBlock(block, 'NUM') - }; + return new IntermediateInput(InputOpcode.OP_ROUND, InputType.NUMBER_INT | InputType.NUMBER_INF, { + value: this.descendInputOfBlock(block, 'NUM').toType(InputType.NUMBER) + }); case 'operator_subtract': - return this.descendVariadicOperator(block, 'NUM', BLOCKS.OP.SUBTRACT); + return this.descendVariadicOperator( + block, 'NUM', InputOpcode.OP_SUBTRACT, InputType.NUMBER_OR_NAN, InputType.NUMBER + ); - case 'procedures_call': - return this.descendProcedure(block); + case 'procedures_call': { + const procedureInfo = this.getProcedureInfo(block); + return new IntermediateInput(procedureInfo.opcode, InputType.ANY, procedureInfo.inputs, procedureInfo.yields); + } case 'sensing_answer': - return { - kind: BLOCKS.SENSING.ANSWER - }; + return new IntermediateInput(InputOpcode.SENSING_ANSWER, InputType.STRING); + case 'sensing_coloristouchingcolor': - return { - kind: BLOCKS.SENSING.COLOR_TOUCHING_COLOR, - target: this.descendInputOfBlock(block, 'COLOR2'), - mask: this.descendInputOfBlock(block, 'COLOR') - }; + return new IntermediateInput(InputOpcode.SENSING_COLOR_TOUCHING_COLOR, InputType.BOOLEAN, { + target: this.descendInputOfBlock(block, 'COLOR2').toType(InputType.COLOR), + mask: this.descendInputOfBlock(block, 'COLOR').toType(InputType.COLOR) + }); case 'sensing_current': switch (block.fields.CURRENTMENU.value.toLowerCase()) { - case 'year': - return { - kind: BLOCKS.SENSING.YEAR - }; - case 'month': - return { - kind: BLOCKS.SENSING.MONTH - }; - case 'date': - return { - kind: BLOCKS.SENSING.DATE - }; - case 'dayofweek': - return { - kind: BLOCKS.SENSING.DAYOFWEEK - }; - case 'hour': - return { - kind: BLOCKS.SENSING.HOUR - }; - case 'minute': - return { - kind: BLOCKS.SENSING.MINUTE - }; - case 'second': - return { - kind: BLOCKS.SENSING.SECOND - }; - case 'refreshtime': - return { - kind: BLOCKS.SENSING.REFRESH_TIME - }; + case 'year': return new IntermediateInput(InputOpcode.SENSING_TIME_YEAR, InputType.NUMBER_POS_INT | InputType.NUMBER_ZERO); + case 'month': return new IntermediateInput(InputOpcode.SENSING_TIME_MONTH, InputType.NUMBER_POS_INT); + case 'date': return new IntermediateInput(InputOpcode.SENSING_TIME_DATE, InputType.NUMBER_POS_INT); + case 'dayofweek': return new IntermediateInput(InputOpcode.SENSING_TIME_WEEKDAY, InputType.NUMBER_POS_INT); + case 'hour': return new IntermediateInput(InputOpcode.SENSING_TIME_HOUR, InputType.NUMBER_POS_INT | InputType.NUMBER_ZERO); + case 'minute': return new IntermediateInput(InputOpcode.SENSING_TIME_MINUTE, InputType.NUMBER_POS_INT | InputType.NUMBER_ZERO); + case 'second': return new IntermediateInput(InputOpcode.SENSING_TIME_SECOND, InputType.NUMBER_POS_INT | InputType.NUMBER_ZERO); + default: return this.createConstantInput(0); } - return { - kind: BLOCKS.CONSTANT, - value: 0 - }; case 'sensing_dayssince2000': - return { - kind: BLOCKS.SENSING.DAYS_SINCE_2000 - }; + return new IntermediateInput(InputOpcode.SENSING_TIME_DAYS_SINCE_2000, InputType.NUMBER); case 'sensing_distanceto': - return { - kind: BLOCKS.SENSING.DISTANCE, - target: this.descendInputOfBlock(block, 'DISTANCETOMENU') - }; + return new IntermediateInput(InputOpcode.SENSING_DISTANCE, InputType.NUMBER_POS | InputType.NUMBER_ZERO, { + target: this.descendInputOfBlock(block, 'DISTANCETOMENU').toType(InputType.STRING) + }); case 'sensing_keypressed': - return { - kind: BLOCKS.KEYBOARD.PRESSED, - key: this.descendInputOfBlock(block, 'KEY_OPTION') - }; + return new IntermediateInput(InputOpcode.SENSING_KEY_DOWN, InputType.BOOLEAN, { + key: this.descendInputOfBlock(block, 'KEY_OPTION', true) + }); case 'sensing_mousedown': - return { - kind: BLOCKS.MOUSE.DOWN - }; + return new IntermediateInput(InputOpcode.SENSING_MOUSE_DOWN, InputType.BOOLEAN); case 'sensing_mousex': - return { - kind: BLOCKS.MOUSE.X - }; + return new IntermediateInput(InputOpcode.SENSING_MOUSE_X, InputType.NUMBER); case 'sensing_mousey': - return { - kind: BLOCKS.MOUSE.Y - }; - case 'sensing_of': - return { - kind: BLOCKS.SENSING.OF, - property: block.fields.PROPERTY.value, - object: this.descendInputOfBlock(block, 'OBJECT') - }; - case 'sensing_timer': - this.usesTimer = true; - return { - kind: BLOCKS.TIMER.GET - }; - case 'sensing_touchingcolor': - return { - kind: BLOCKS.SENSING.TOUCHING_COLOR, - color: this.descendInputOfBlock(block, 'COLOR') - }; - case 'sensing_touchingobject': - return { - kind: BLOCKS.SENSING.TOUCHING, + return new IntermediateInput(InputOpcode.SENSING_MOUSE_Y, InputType.NUMBER); + case 'sensing_of': { + const property = block.fields.PROPERTY.value; + const object = this.descendInputOfBlock(block, 'OBJECT').toType(InputType.STRING); + + if (object.opcode !== InputOpcode.CONSTANT) { + return new IntermediateInput(InputOpcode.SENSING_OF, InputType.ANY, {object, property}); + } + + if (property === 'volume') { + return new IntermediateInput(InputOpcode.SENSING_OF_VOLUME, InputType.NUMBER_POS_REAL | InputType.NUMBER_ZERO, {object, property}); + } + + if (object.isConstant('_stage_')) { + // We assume that the stage always exists, so these don't need to be able to return 0. + switch (property) { + case 'background #': // fallthrough for scratch 1.0 compatibility + case 'backdrop #': + return new IntermediateInput(InputOpcode.SENSING_OF_BACKDROP_NUMBER, InputType.NUMBER_POS_INT); + case 'backdrop name': + return new IntermediateInput(InputOpcode.SENSING_OF_BACKDROP_NAME, InputType.STRING); + } + } else { + // If the target sprite does not exist, these may all return 0, even the costume name one. + switch (property) { + case 'x position': + return new IntermediateInput(InputOpcode.SENSING_OF_POS_X, InputType.NUMBER, {object}); + case 'y position': + return new IntermediateInput(InputOpcode.SENSING_OF_POS_Y, InputType.NUMBER, {object}); + case 'direction': + return new IntermediateInput(InputOpcode.SENSING_OF_DIRECTION, InputType.NUMBER_REAL, {object}); + case 'costume #': + return new IntermediateInput(InputOpcode.SENSING_OF_COSTUME_NUMBER, InputType.NUMBER_POS_INT | InputType.NUMBER_ZERO, {object}); + case 'costume name': + return new IntermediateInput(InputOpcode.SENSING_OF_COSTUME_NAME, InputType.STRING | InputType.NUMBER_ZERO, {object}); + case 'size': + return new IntermediateInput(InputOpcode.SENSING_OF_SIZE, InputType.NUMBER_POS | InputType.NUMBER_ZERO, {object}); + } + } + + return new IntermediateInput(InputOpcode.SENSING_OF_VAR, InputType.ANY, {object, property}); + } + case 'sensing_timer': + this.usesTimer = true; + return new IntermediateInput(InputOpcode.SENSING_TIMER_GET, InputType.NUMBER_POS_REAL | InputType.NUMBER_ZERO); + case 'sensing_touchingcolor': + return new IntermediateInput(InputOpcode.SENSING_TOUCHING_COLOR, InputType.BOOLEAN, { + color: this.descendInputOfBlock(block, 'COLOR').toType(InputType.COLOR) + }); + case 'sensing_touchingobject': + return new IntermediateInput(InputOpcode.SENSING_TOUCHING_OBJECT, InputType.BOOLEAN, { object: this.descendInputOfBlock(block, 'TOUCHINGOBJECTMENU') - }; - case 'sensing_online': - return { - kind: BLOCKS.SENSING.ONLINE - }; + }); case 'sensing_username': - return { - kind: BLOCKS.SENSING.USERNAME - }; + return new IntermediateInput(InputOpcode.SENSING_USERNAME, InputType.STRING); case 'sound_sounds_menu': // This menu is special compared to other menus -- it actually has an opcode function. - return { - kind: BLOCKS.CONSTANT, - value: block.fields.SOUND_MENU.value - }; + return this.createConstantInput(block.fields.SOUND_MENU.value, true); + + case 'control_get_counter': + return new IntermediateInput(InputOpcode.CONTROL_COUNTER, InputType.NUMBER_POS_INT | InputType.NUMBER_ZERO); case 'tw_getLastKeyPressed': - return { - kind: BLOCKS.TW.LAST_KEY_PRESSED - }; + return new IntermediateInput(InputOpcode.TW_KEY_LAST_PRESSED, InputType.STRING); default: { - if (compiledExtensions.canCompile(block.opcode, this.runtime)) { - return this.descendCompiledExtension(block); - } const opcodeFunction = this.runtime.getOpcodeFunction(block.opcode); if (opcodeFunction) { - // It might be a non-compiled primitive from a standard category - if (compatBlocks.inputs.includes(block.opcode)) { - return this.descendCompatLayer(block); - } - // It might be an extension block. - const blockInfo = this.getBlockInfo(block.opcode); - if (blockInfo) { - const type = blockInfo.info.blockType; - if (type === BlockType.REPORTER || type === BlockType.BOOLEAN) { - return this.descendCompatLayer(block); - } - } + return this.descendCompatLayerInput(block); } // It might be a menu. const inputs = Object.keys(block.inputs); const fields = Object.keys(block.fields); if (inputs.length === 0 && fields.length === 1) { - return { - kind: BLOCKS.CONSTANT, - value: block.fields[fields[0]].value - }; + return this.createConstantInput(block.fields[fields[0]].value, preserveStrings); } log.warn(`IR: Unknown input: ${block.opcode}`, block); @@ -815,562 +689,448 @@ class ScriptTreeGenerator { * Descend into a stacked block. (eg. "move ( ) steps") * @param {*} block The Scratch block to parse. * @private - * @returns {node} Compiled node for this block. + * @returns {IntermediateStackBlock} Compiled node for this block. */ descendStackedBlock (block) { + if (RAW_SOURCE_COMMANDS.has(block.opcode)) { + return new IntermediateStackBlock(StackOpcode.RAW_SOURCE, { + fragments: this.descendRawSourceFragments(block) + }); + } + const rawSourceType = RAW_SOURCE_REPORTERS.get(block.opcode); + if (rawSourceType) { + return new IntermediateStackBlock(StackOpcode.VISUAL_REPORT, { + input: this.descendRawSourceInput(block, rawSourceType) + }); + } + + const compilerExtension = this.runtime.compilerExtensions.get(block.opcode); + if (compilerExtension) { + if (compilerExtension.type === 'command') { + return this.descendCompilerExtensionStack(block, compilerExtension); + } + return new IntermediateStackBlock(StackOpcode.VISUAL_REPORT, { + input: this.descendCompilerExtensionInput(block, compilerExtension) + }); + } + + if (this.oldCompilerStub) { + const oldCompilerResult = this.oldCompilerStub.descendStackedBlockFromNewCompiler(block); + if (oldCompilerResult) { + return oldCompilerResult; + } + } + switch (block.opcode) { case 'control_all_at_once': // In Scratch 3, this block behaves like "if 1 = 1" - return { - kind: BLOCKS.CONTROL.IF, - condition: { - kind: BLOCKS.CONSTANT, - value: true - }, + return new IntermediateStackBlock(StackOpcode.CONTROL_IF_ELSE, { + condition: this.createConstantInput(true).toType(InputType.BOOLEAN), whenTrue: this.descendSubstack(block, 'SUBSTACK'), - whenFalse: [] - }; - case 'control_clear_counter': - return { - kind: BLOCKS.COUNTER.CLEAR - }; + whenFalse: new IntermediateStack() + }); case 'control_create_clone_of': - return { - kind: BLOCKS.CONTROL.CREATE_CLONE, - target: this.descendInputOfBlock(block, 'CLONE_OPTION') - }; + return new IntermediateStackBlock(StackOpcode.CONTROL_CLONE_CREATE, { + target: this.descendInputOfBlock(block, 'CLONE_OPTION').toType(InputType.STRING) + }); case 'control_delete_this_clone': - this.script.yields = true; - return { - kind: BLOCKS.CONTROL.DELETE_CLONE - }; + return new IntermediateStackBlock(StackOpcode.CONTROL_CLONE_DELETE, {}, true); case 'control_forever': - this.analyzeLoop(); - return { - kind: BLOCKS.CONTROL.WHILE, - condition: { - kind: BLOCKS.CONSTANT, - value: true - }, + return new IntermediateStackBlock(StackOpcode.CONTROL_WHILE, { + condition: this.createConstantInput(true).toType(InputType.BOOLEAN), do: this.descendSubstack(block, 'SUBSTACK') - }; + }, this.analyzeLoop()); case 'control_for_each': - this.analyzeLoop(); - return { - kind: BLOCKS.CONTROL.FOR, + return new IntermediateStackBlock(StackOpcode.CONTROL_FOR, { variable: this.descendVariable(block, 'VARIABLE', SCALAR_TYPE), - count: this.descendInputOfBlock(block, 'VALUE'), + count: this.descendInputOfBlock(block, 'VALUE').toType(InputType.NUMBER), do: this.descendSubstack(block, 'SUBSTACK') - }; + }, this.analyzeLoop()); case 'control_if': - return { - kind: BLOCKS.CONTROL.IF, - condition: this.descendInputOfBlock(block, 'CONDITION'), + return new IntermediateStackBlock(StackOpcode.CONTROL_IF_ELSE, { + condition: this.descendInputOfBlock(block, 'CONDITION').toType(InputType.BOOLEAN), whenTrue: this.descendSubstack(block, 'SUBSTACK'), - whenFalse: [] - }; + whenFalse: new IntermediateStack() + }); case 'control_if_else': - return { - kind: BLOCKS.CONTROL.IF, - condition: this.descendInputOfBlock(block, 'CONDITION'), + return new IntermediateStackBlock(StackOpcode.CONTROL_IF_ELSE, { + condition: this.descendInputOfBlock(block, 'CONDITION').toType(InputType.BOOLEAN), whenTrue: this.descendSubstack(block, 'SUBSTACK'), whenFalse: this.descendSubstack(block, 'SUBSTACK2') - }; - case 'control_incr_counter': - return { - kind: BLOCKS.COUNTER.INCR - }; + }); case 'control_repeat': - this.analyzeLoop(); - return { - kind: BLOCKS.CONTROL.REPEAT, - times: this.descendInputOfBlock(block, 'TIMES'), + return new IntermediateStackBlock(StackOpcode.CONTROL_REPEAT, { + times: this.descendInputOfBlock(block, 'TIMES').toType(InputType.NUMBER), do: this.descendSubstack(block, 'SUBSTACK') - }; + }, this.analyzeLoop()); case 'control_repeat_until': { - this.analyzeLoop(); // Dirty hack: automatically enable warp timer for this block if it uses timer // This fixes project that do things like "repeat until timer > 0.5" this.usesTimer = false; - const condition = this.descendInputOfBlock(block, 'CONDITION'); + const condition = this.descendInputOfBlock(block, 'CONDITION').toType(InputType.BOOLEAN); const needsWarpTimer = this.usesTimer; - if (needsWarpTimer) { - this.script.yields = true; - } - return { - kind: BLOCKS.CONTROL.WHILE, - condition: { - kind: BLOCKS.OP.NOT, + return new IntermediateStackBlock(StackOpcode.CONTROL_WHILE, { + condition: new IntermediateInput(InputOpcode.OP_NOT, InputType.BOOLEAN, { operand: condition - }, + }), do: this.descendSubstack(block, 'SUBSTACK'), warpTimer: needsWarpTimer - }; + }, this.analyzeLoop() || needsWarpTimer); } case 'control_stop': { const level = block.fields.STOP_OPTION.value; if (level === 'all') { - this.script.yields = true; - return { - kind: BLOCKS.CONTROL.STOP_ALL - }; + return new IntermediateStackBlock(StackOpcode.CONTROL_STOP_ALL, {}, true); } else if (level === 'other scripts in sprite' || level === 'other scripts in stage') { - return { - kind: BLOCKS.CONTROL.STOP_OTHERS - }; + return new IntermediateStackBlock(StackOpcode.CONTROL_STOP_OTHERS); } else if (level === 'this script') { - return { - kind: BLOCKS.CONTROL.STOP_SCRIPT - }; + return new IntermediateStackBlock(StackOpcode.CONTROL_STOP_SCRIPT); } - return { - kind: BLOCKS.NOOP - }; + return new IntermediateStackBlock(StackOpcode.NOP); } case 'control_wait': - this.script.yields = true; - return { - kind: BLOCKS.CONTROL.WAIT, - seconds: this.descendInputOfBlock(block, 'DURATION') - }; + return new IntermediateStackBlock(StackOpcode.CONTROL_WAIT, { + seconds: this.descendInputOfBlock(block, 'DURATION').toType(InputType.NUMBER) + }, true); case 'control_wait_until': - this.script.yields = true; - return { - kind: BLOCKS.CONTROL.WAIT_UNTIL, - condition: this.descendInputOfBlock(block, 'CONDITION') - }; + return new IntermediateStackBlock(StackOpcode.CONTROL_WAIT_UNTIL, { + condition: this.descendInputOfBlock(block, 'CONDITION').toType(InputType.BOOLEAN) + }, true); case 'control_while': - this.analyzeLoop(); - return { - kind: BLOCKS.CONTROL.WHILE, - condition: this.descendInputOfBlock(block, 'CONDITION'), + return new IntermediateStackBlock(StackOpcode.CONTROL_WHILE, { + condition: this.descendInputOfBlock(block, 'CONDITION').toType(InputType.BOOLEAN), do: this.descendSubstack(block, 'SUBSTACK'), // We should consider analyzing this like we do for control_repeat_until warpTimer: false - }; + }, this.analyzeLoop()); case 'control_switch': - return { - kind: BLOCKS.CONTROL.SWITCH, - value: this.descendInputOfBlock(block, 'VALUE'), + return new IntermediateStackBlock(StackOpcode.CONTROL_SWITCH, { + value: this.descendSwitchValue(block), do: this.descendSubstack(block, 'SUBSTACK') - }; + }); case 'control_case': - return { - kind: BLOCKS.CONTROL.CASE, - value: this.descendInputOfBlock(block, 'VALUE'), + return new IntermediateStackBlock(StackOpcode.CONTROL_CASE, { + value: this.descendSwitchValue(block), do: this.descendSubstack(block, 'SUBSTACK') - }; + }); case 'control_default': - return { - kind: BLOCKS.CONTROL.DEFAULT, + return new IntermediateStackBlock(StackOpcode.CONTROL_DEFAULT, { do: this.descendSubstack(block, 'SUBSTACK') - }; + }); case 'control_break': - return { - kind: BLOCKS.CONTROL.BREAK - }; + return new IntermediateStackBlock(StackOpcode.CONTROL_BREAK); case 'control_case_fallthrough': - return { - kind: BLOCKS.CONTROL.CASE_FALLTHROUGH, - value: this.descendInputOfBlock(block, 'VALUE') - }; + return new IntermediateStackBlock(StackOpcode.CONTROL_CASE_FALLTHROUGH, { + value: this.descendSwitchValue(block) + }); + case 'control_clear_counter': + return new IntermediateStackBlock(StackOpcode.CONTROL_CLEAR_COUNTER); + case 'control_incr_counter': + return new IntermediateStackBlock(StackOpcode.CONTORL_INCR_COUNTER); case 'data_addtolist': - return { - kind: BLOCKS.LIST.ADD, - list: this.descendVariable(block, 'LIST', LIST_TYPE), - item: this.descendInputOfBlock(block, 'ITEM') - }; - case 'data_set_list_to_array': - return { - kind: BLOCKS.LIST.SET_ARRAY, + return new IntermediateStackBlock(StackOpcode.LIST_ADD, { list: this.descendVariable(block, 'LIST', LIST_TYPE), - array: this.descendInputOfBlock(block, 'ARRAY') - }; + item: this.descendInputOfBlock(block, 'ITEM', true) + }); case 'data_changevariableby': { const variable = this.descendVariable(block, 'VARIABLE', SCALAR_TYPE); - return { - kind: BLOCKS.VAR.SET, + return new IntermediateStackBlock(StackOpcode.VAR_SET, { variable, - value: { - kind: BLOCKS.OP.ADD, - left: { - kind: BLOCKS.VAR.GET, - variable - }, - right: this.descendInputOfBlock(block, 'VALUE') - } - }; + value: new IntermediateInput(InputOpcode.OP_ADD, InputType.NUMBER_OR_NAN, { + left: new IntermediateInput(InputOpcode.VAR_GET, InputType.ANY, {variable}).toType(InputType.NUMBER), + right: this.descendInputOfBlock(block, 'VALUE').toType(InputType.NUMBER) + }) + }); } case 'data_deletealloflist': - return { - kind: BLOCKS.LIST.DELETE_ALL, + return new IntermediateStackBlock(StackOpcode.LIST_DELETE_ALL, { list: this.descendVariable(block, 'LIST', LIST_TYPE) - }; + }); case 'data_deleteoflist': { const index = this.descendInputOfBlock(block, 'INDEX'); - if (index.kind === BLOCKS.CONSTANT && index.value === 'all') { - return { - kind: BLOCKS.LIST.DELETE_ALL, + if (index.isConstant('all')) { + return new IntermediateStackBlock(StackOpcode.LIST_DELETE_ALL, { list: this.descendVariable(block, 'LIST', LIST_TYPE) - }; + }); } - return { - kind: BLOCKS.LIST.DELETE, + return new IntermediateStackBlock(StackOpcode.LIST_DELETE, { list: this.descendVariable(block, 'LIST', LIST_TYPE), index: index - }; + }); } case 'data_hidelist': - return { - kind: BLOCKS.LIST.HIDE, + return new IntermediateStackBlock(StackOpcode.LIST_HIDE, { list: this.descendVariable(block, 'LIST', LIST_TYPE) - }; + }); case 'data_hidevariable': - return { - kind: BLOCKS.VAR.HIDE, + return new IntermediateStackBlock(StackOpcode.VAR_HIDE, { variable: this.descendVariable(block, 'VARIABLE', SCALAR_TYPE) - }; + }); case 'data_insertatlist': - return { - kind: BLOCKS.LIST.INSERT, + return new IntermediateStackBlock(StackOpcode.LIST_INSERT, { list: this.descendVariable(block, 'LIST', LIST_TYPE), index: this.descendInputOfBlock(block, 'INDEX'), - item: this.descendInputOfBlock(block, 'ITEM') - }; + item: this.descendInputOfBlock(block, 'ITEM', true) + }); case 'data_replaceitemoflist': - return { - kind: BLOCKS.LIST.REPLACE, + return new IntermediateStackBlock(StackOpcode.LIST_REPLACE, { list: this.descendVariable(block, 'LIST', LIST_TYPE), index: this.descendInputOfBlock(block, 'INDEX'), - item: this.descendInputOfBlock(block, 'ITEM') - }; + item: this.descendInputOfBlock(block, 'ITEM', true) + }); case 'data_setvariableto': - return { - kind: BLOCKS.VAR.SET, + return new IntermediateStackBlock(StackOpcode.VAR_SET, { variable: this.descendVariable(block, 'VARIABLE', SCALAR_TYPE), - value: this.descendInputOfBlock(block, 'VALUE') - }; + value: this.descendInputOfBlock(block, 'VALUE', true) + }); case 'data_showlist': - return { - kind: BLOCKS.LIST.SHOW, + return new IntermediateStackBlock(StackOpcode.LIST_SHOW, { list: this.descendVariable(block, 'LIST', LIST_TYPE) - }; + }); + case 'data_set_list_to_array': + return new IntermediateStackBlock(StackOpcode.LIST_SET_ARRAY, { + list: this.descendVariable(block, 'LIST', LIST_TYPE), + array: this.descendInputOfBlock(block, block.inputs.ARRAY ? 'ARRAY' : 'VALUE').toType(InputType.STRING) + }); case 'data_showvariable': - return { - kind: BLOCKS.VAR.SHOW, + return new IntermediateStackBlock(StackOpcode.VAR_SHOW, { variable: this.descendVariable(block, 'VARIABLE', SCALAR_TYPE) - }; + }); case 'event_broadcast': - return { - kind: BLOCKS.EVENT.BROADCAST, - broadcast: this.descendInputOfBlock(block, 'BROADCAST_INPUT') - }; + return new IntermediateStackBlock(StackOpcode.EVENT_BROADCAST, { + broadcast: this.descendInputOfBlock(block, 'BROADCAST_INPUT').toType(InputType.STRING) + }); case 'event_broadcastandwait': - this.script.yields = true; - return { - kind: BLOCKS.EVENT.BROADCAST_AND_WAIT, - broadcast: this.descendInputOfBlock(block, 'BROADCAST_INPUT') - }; + return new IntermediateStackBlock(StackOpcode.EVENT_BROADCAST_AND_WAIT, { + broadcast: this.descendInputOfBlock(block, 'BROADCAST_INPUT').toType(InputType.STRING) + }, true); case 'looks_changeeffectby': - return { - kind: BLOCKS.LOOKS.CHANGE_EFFECT, + return new IntermediateStackBlock(StackOpcode.LOOKS_EFFECT_CHANGE, { effect: block.fields.EFFECT.value.toLowerCase(), - value: this.descendInputOfBlock(block, 'CHANGE') - }; + value: this.descendInputOfBlock(block, 'CHANGE').toType(InputType.NUMBER) + }); case 'looks_changesizeby': - return { - kind: BLOCKS.LOOKS.CHANGE_SIZE, - size: this.descendInputOfBlock(block, 'CHANGE') - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_SIZE_CHANGE, { + size: this.descendInputOfBlock(block, 'CHANGE').toType(InputType.NUMBER) + }); case 'looks_cleargraphiceffects': - return { - kind: BLOCKS.LOOKS.CLEAR_EFFECTS - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_EFFECT_CLEAR); case 'looks_goforwardbackwardlayers': if (block.fields.FORWARD_BACKWARD.value === 'forward') { - return { - kind: BLOCKS.LOOKS.FORWARD_LAYERS, - layers: this.descendInputOfBlock(block, 'NUM') - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_LAYER_FORWARD, { + layers: this.descendInputOfBlock(block, 'NUM').toType(InputType.NUMBER) + }); } - return { - kind: BLOCKS.LOOKS.BACKWARD_LAYERS, - layers: this.descendInputOfBlock(block, 'NUM') - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_LAYER_BACKWARD, { + layers: this.descendInputOfBlock(block, 'NUM').toType(InputType.NUMBER) + }); case 'looks_gotofrontback': if (block.fields.FRONT_BACK.value === 'front') { - return { - kind: BLOCKS.LOOKS.GOTO_FRONT - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_LAYER_FRONT); } - return { - kind: BLOCKS.LOOKS.GOTO_BACK - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_LAYER_BACK); case 'looks_hide': - return { - kind: BLOCKS.LOOKS.HIDE - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_HIDE); case 'looks_nextbackdrop': - return { - kind: BLOCKS.LOOKS.NEXT_BACKDROP - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_BACKDROP_NEXT); case 'looks_nextcostume': - return { - kind: BLOCKS.LOOKS.NEXT_COSTUME - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_COSTUME_NEXT); case 'looks_say': - return { - kind: BLOCKS.LOOKS.SAY, + return new IntermediateStackBlock(StackOpcode.LOOKS_SAY, { message: this.descendInputOfBlock(block, 'MESSAGE') - }; + }); case 'looks_seteffectto': - return { - kind: BLOCKS.LOOKS.SET_EFFECT, + return new IntermediateStackBlock(StackOpcode.LOOKS_EFFECT_SET, { effect: block.fields.EFFECT.value.toLowerCase(), - value: this.descendInputOfBlock(block, 'VALUE') - }; + value: this.descendInputOfBlock(block, 'VALUE').toType(InputType.NUMBER) + }); case 'looks_setsizeto': - return { - kind: BLOCKS.LOOKS.SET_SIZE, - size: this.descendInputOfBlock(block, 'SIZE') - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_SIZE_SET, { + size: this.descendInputOfBlock(block, 'SIZE').toType(InputType.NUMBER) + }); case 'looks_show': - return { - kind: BLOCKS.LOOKS.SHOW - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_SHOW); case 'looks_switchbackdropto': - return { - kind: BLOCKS.LOOKS.SWITCH_BACKDROP, - backdrop: this.descendInputOfBlock(block, 'BACKDROP') - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_BACKDROP_SET, { + backdrop: this.descendInputOfBlock(block, 'BACKDROP', true) + }); case 'looks_switchcostumeto': - return { - kind: BLOCKS.LOOKS.SWITCH_COSTUME, - costume: this.descendInputOfBlock(block, 'COSTUME') - }; + return new IntermediateStackBlock(StackOpcode.LOOKS_COSTUME_SET, { + costume: this.descendInputOfBlock(block, 'COSTUME', true) + }); case 'looks_think': - return { - kind: BLOCKS.LOOKS.THINK, + return new IntermediateStackBlock(StackOpcode.LOOKS_THINK, { message: this.descendInputOfBlock(block, 'MESSAGE') - }; + }); case 'motion_changexby': - return { - kind: BLOCKS.MOTION.CHANGE_X, - dx: this.descendInputOfBlock(block, 'DX') - }; + return new IntermediateStackBlock(StackOpcode.MOTION_X_CHANGE, { + dx: this.descendInputOfBlock(block, 'DX').toType(InputType.NUMBER) + }); case 'motion_changeyby': - return { - kind: BLOCKS.MOTION.CHANGE_Y, - dy: this.descendInputOfBlock(block, 'DY') - }; + return new IntermediateStackBlock(StackOpcode.MOTION_Y_CHANGE, { + dy: this.descendInputOfBlock(block, 'DY').toType(InputType.NUMBER) + }); case 'motion_gotoxy': - return { - kind: BLOCKS.MOTION.SET_XY, - x: this.descendInputOfBlock(block, 'X'), - y: this.descendInputOfBlock(block, 'Y') - }; + return new IntermediateStackBlock(StackOpcode.MOTION_XY_SET, { + x: this.descendInputOfBlock(block, 'X').toType(InputType.NUMBER), + y: this.descendInputOfBlock(block, 'Y').toType(InputType.NUMBER) + }); case 'motion_ifonedgebounce': - return { - kind: BLOCKS.MOTION.IF_ON_EDGE_BOUNCE - }; + return new IntermediateStackBlock(StackOpcode.MOTION_IF_ON_EDGE_BOUNCE); case 'motion_movesteps': - return { - kind: BLOCKS.MOTION.STEP, - steps: this.descendInputOfBlock(block, 'STEPS') - }; + return new IntermediateStackBlock(StackOpcode.MOTION_STEP, { + steps: this.descendInputOfBlock(block, 'STEPS').toType(InputType.NUMBER) + }); case 'motion_pointindirection': - return { - kind: BLOCKS.MOTION.SET_DIRECTION, - direction: this.descendInputOfBlock(block, 'DIRECTION') - }; + return new IntermediateStackBlock(StackOpcode.MOTION_DIRECTION_SET, { + direction: this.descendInputOfBlock(block, 'DIRECTION').toType(InputType.NUMBER) + }); case 'motion_pointtowards_xy': - return { - kind: BLOCKS.MOTION.POINT_TOWARDS_XY, - x: this.descendInputOfBlock(block, 'X'), - y: this.descendInputOfBlock(block, 'Y') - }; + return new IntermediateStackBlock(StackOpcode.MOTION_POINT_TOWARDS_XY, { + x: this.descendInputOfBlock(block, 'X').toType(InputType.NUMBER), + y: this.descendInputOfBlock(block, 'Y').toType(InputType.NUMBER) + }); case 'motion_pointtowards_xyfrom': - return { - kind: BLOCKS.MOTION.POINT_TOWARDS_XY_FROM, - x: this.descendInputOfBlock(block, 'X'), - y: this.descendInputOfBlock(block, 'Y'), - fromx: this.descendInputOfBlock(block, 'FROMX'), - fromy: this.descendInputOfBlock(block, 'FROMY') - }; + return new IntermediateStackBlock(StackOpcode.MOTION_POINT_TOWARDS_XY_FROM, { + x: this.descendInputOfBlock(block, 'X').toType(InputType.NUMBER), + y: this.descendInputOfBlock(block, 'Y').toType(InputType.NUMBER), + fromX: this.descendInputOfBlock(block, 'FROMX').toType(InputType.NUMBER), + fromY: this.descendInputOfBlock(block, 'FROMY').toType(InputType.NUMBER) + }); case 'motion_setrotationstyle': - return { - kind: BLOCKS.MOTION.SET_ROTATION_STYLE, + return new IntermediateStackBlock(StackOpcode.MOTION_ROTATION_STYLE_SET, { style: block.fields.STYLE.value - }; + }); case 'motion_setx': - return { - kind: BLOCKS.MOTION.SET_X, - x: this.descendInputOfBlock(block, 'X') - }; + return new IntermediateStackBlock(StackOpcode.MOTION_X_SET, { + x: this.descendInputOfBlock(block, 'X').toType(InputType.NUMBER) + }); case 'motion_sety': - return { - kind: BLOCKS.MOTION.SET_Y, - y: this.descendInputOfBlock(block, 'Y') - }; + return new IntermediateStackBlock(StackOpcode.MOTION_Y_SET, { + y: this.descendInputOfBlock(block, 'Y').toType(InputType.NUMBER) + }); case 'motion_turnleft': - return { - kind: BLOCKS.MOTION.SET_DIRECTION, - direction: { - kind: BLOCKS.OP.SUBTRACT, - left: { - kind: BLOCKS.MOTION.DIRECTION - }, - right: this.descendInputOfBlock(block, 'DEGREES') - } - }; + return new IntermediateStackBlock(StackOpcode.MOTION_DIRECTION_SET, { + direction: new IntermediateInput(InputOpcode.OP_SUBTRACT, InputType.NUMBER, { + left: new IntermediateInput(InputOpcode.MOTION_DIRECTION_GET, InputType.NUMBER), + right: this.descendInputOfBlock(block, 'DEGREES').toType(InputType.NUMBER) + }) + }); case 'motion_turnright': - return { - kind: BLOCKS.MOTION.SET_DIRECTION, - direction: { - kind: BLOCKS.OP.ADD, - left: { - kind: BLOCKS.MOTION.DIRECTION - }, - right: this.descendInputOfBlock(block, 'DEGREES') - } - }; + return new IntermediateStackBlock(StackOpcode.MOTION_DIRECTION_SET, { + direction: new IntermediateInput(InputOpcode.OP_ADD, InputType.NUMBER, { + left: new IntermediateInput(InputOpcode.MOTION_DIRECTION_GET, InputType.NUMBER), + right: this.descendInputOfBlock(block, 'DEGREES').toType(InputType.NUMBER) + }) + }); case 'pen_clear': - return { - kind: BLOCKS.PEN.CLEAR - }; + return new IntermediateStackBlock(StackOpcode.PEN_CLEAR); case 'pen_changePenColorParamBy': - return { - kind: BLOCKS.PEN.CHANGE_PARAM, - param: this.descendInputOfBlock(block, 'COLOR_PARAM'), - value: this.descendInputOfBlock(block, 'VALUE') - }; + return new IntermediateStackBlock(StackOpcode.PEN_COLOR_PARAM_CHANGE, { + param: this.descendInputOfBlock(block, 'COLOR_PARAM').toType(InputType.STRING), + value: this.descendInputOfBlock(block, 'VALUE').toType(InputType.NUMBER) + }); case 'pen_changePenHueBy': - return { - kind: BLOCKS.PEN.LEGACY_CHANGE_HUE, - hue: this.descendInputOfBlock(block, 'HUE') - }; + return new IntermediateStackBlock(StackOpcode.PEN_COLOR_HUE_CHANGE_LEGACY, { + hue: this.descendInputOfBlock(block, 'HUE').toType(InputType.NUMBER) + }); case 'pen_changePenShadeBy': - return { - kind: BLOCKS.PEN.LEGACY_CHANGE_SHADE, - shade: this.descendInputOfBlock(block, 'SHADE') - }; + return new IntermediateStackBlock(StackOpcode.PEN_COLOR_SHADE_CHANGE_LEGACY, { + shade: this.descendInputOfBlock(block, 'SHADE').toType(InputType.NUMBER) + }); case 'pen_penDown': - return { - kind: BLOCKS.PEN.DOWN - }; + return new IntermediateStackBlock(StackOpcode.PEN_DOWN); case 'pen_penUp': - return { - kind: BLOCKS.PEN.UP - }; + return new IntermediateStackBlock(StackOpcode.PEN_UP); case 'pen_setPenColorParamTo': - return { - kind: BLOCKS.PEN.SET_PARAM, - param: this.descendInputOfBlock(block, 'COLOR_PARAM'), - value: this.descendInputOfBlock(block, 'VALUE') - }; + return new IntermediateStackBlock(StackOpcode.PEN_COLOR_PARAM_SET, { + param: this.descendInputOfBlock(block, 'COLOR_PARAM').toType(InputType.STRING), + value: this.descendInputOfBlock(block, 'VALUE').toType(InputType.NUMBER) + }); case 'pen_setPenColorToColor': - return { - kind: BLOCKS.PEN.SET_COLOR, + return new IntermediateStackBlock(StackOpcode.PEN_COLOR_SET, { color: this.descendInputOfBlock(block, 'COLOR') - }; + }); case 'pen_setPenHueToNumber': - return { - kind: BLOCKS.PEN.LEGACY_SET_HUE, - hue: this.descendInputOfBlock(block, 'HUE') - }; + return new IntermediateStackBlock(StackOpcode.PEN_COLOR_HUE_SET_LEGACY, { + hue: this.descendInputOfBlock(block, 'HUE').toType(InputType.NUMBER) + }); case 'pen_setPenShadeToNumber': - return { - kind: BLOCKS.PEN.LEGACY_SET_SHADE, - shade: this.descendInputOfBlock(block, 'SHADE') - }; + return new IntermediateStackBlock(StackOpcode.PEN_COLOR_SHADE_SET_LEGACY, { + shade: this.descendInputOfBlock(block, 'SHADE').toType(InputType.NUMBER) + }); case 'pen_setPenSizeTo': - return { - kind: BLOCKS.PEN.SET_SIZE, - size: this.descendInputOfBlock(block, 'SIZE') - }; + return new IntermediateStackBlock(StackOpcode.PEN_SIZE_SET, { + size: this.descendInputOfBlock(block, 'SIZE').toType(InputType.NUMBER) + }); case 'pen_changePenSizeBy': - return { - kind: BLOCKS.PEN.CHANGE_SIZE, - size: this.descendInputOfBlock(block, 'SIZE') - }; + return new IntermediateStackBlock(StackOpcode.PEN_SIZE_CHANGE, { + size: this.descendInputOfBlock(block, 'SIZE').toType(InputType.NUMBER) + }); case 'pen_stamp': - return { - kind: BLOCKS.PEN.STAMP - }; + return new IntermediateStackBlock(StackOpcode.PEN_STAMP); case 'pen_printText': - return { - kind: BLOCKS.PEN.PRINT_TEXT, - text: this.descendInputOfBlock(block, 'TEXT'), - x: this.descendInputOfBlock(block, 'X'), - y: this.descendInputOfBlock(block, 'Y') - }; + return new IntermediateStackBlock(StackOpcode.PEN_PRINT_TEXT, { + text: this.descendInputOfBlock(block, 'TEXT').toType(InputType.STRING), + x: this.descendInputOfBlock(block, 'X').toType(InputType.NUMBER), + y: this.descendInputOfBlock(block, 'Y').toType(InputType.NUMBER) + }); case 'pen_drawTriangle': - return { - kind: BLOCKS.PEN.DRAW_TRIANGLE, - x0: this.descendInputOfBlock(block, 'X0'), - y0: this.descendInputOfBlock(block, 'Y0'), - x1: this.descendInputOfBlock(block, 'X1'), - y1: this.descendInputOfBlock(block, 'Y1'), - x2: this.descendInputOfBlock(block, 'X2'), - y2: this.descendInputOfBlock(block, 'Y2') - }; + return new IntermediateStackBlock(StackOpcode.PEN_DRAW_TRIANGLE, { + x0: this.descendInputOfBlock(block, 'X0').toType(InputType.NUMBER), + y0: this.descendInputOfBlock(block, 'Y0').toType(InputType.NUMBER), + x1: this.descendInputOfBlock(block, 'X1').toType(InputType.NUMBER), + y1: this.descendInputOfBlock(block, 'Y1').toType(InputType.NUMBER), + x2: this.descendInputOfBlock(block, 'X2').toType(InputType.NUMBER), + y2: this.descendInputOfBlock(block, 'Y2').toType(InputType.NUMBER) + }); case 'procedures_call': { const procedureCode = block.mutation.proccode; + if (block.mutation.return) { const visualReport = this.descendVisualReport(block); if (visualReport) { return visualReport; } } + if (procedureCode === 'tw:debugger;') { - return { - kind: BLOCKS.TW.DEBUGGER - }; + return new IntermediateStackBlock(StackOpcode.DEBUGGER); } - return this.descendProcedure(block); + + const procedure = this.getProcedureInfo(block); + return new IntermediateStackBlock(procedure.opcode, procedure.inputs, procedure.yields); } case 'procedures_return': - return { - kind: BLOCKS.PROCEDURES.RETURN, + return new IntermediateStackBlock(StackOpcode.PROCEDURE_RETURN, { value: this.descendInputOfBlock(block, 'VALUE') - }; + }); case 'sensing_resettimer': - return { - kind: BLOCKS.TIMER.RESET - }; + return new IntermediateStackBlock(StackOpcode.SENSING_TIMER_RESET); default: { - if (compiledExtensions.canCompile(block.opcode, this.runtime)) { - const info = compiledExtensions.get(block.opcode); - if (info.type === null) { - return this.descendCompiledExtension(block); - } - const visualReport = this.descendVisualReport(block); - if (visualReport) { - return visualReport; - } - } const opcodeFunction = this.runtime.getOpcodeFunction(block.opcode); if (opcodeFunction) { - // It might be a non-compiled primitive from a standard category if (compatBlocks.stacked.includes(block.opcode)) { - return this.descendCompatLayer(block); + return this.descendCompatLayerStack(block); } - // It might be an extension block. const blockInfo = this.getBlockInfo(block.opcode); if (blockInfo) { const type = blockInfo.info.blockType; if (type === BlockType.COMMAND || type === BlockType.CONDITIONAL || type === BlockType.LOOP) { - return this.descendCompatLayer(block); + return this.descendCompatLayerStack(block); } } + const asVisualReport = this.descendVisualReport(block); + if (asVisualReport) return asVisualReport; + return this.descendCompatLayerStack(block); } const asVisualReport = this.descendVisualReport(block); @@ -1387,14 +1147,14 @@ class ScriptTreeGenerator { /** * Descend into a stack of blocks (eg. the blocks contained within an "if" block) * @param {*} parentBlock The parent Scratch block that contains the stack to parse. - * @param {*} substackName The name of the stack to descend into. + * @param {string} substackName The name of the stack to descend into. * @private - * @returns {node[]} List of stacked block nodes. + * @returns {IntermediateStack} Stacked blocks. */ descendSubstack (parentBlock, substackName) { const input = parentBlock.inputs[substackName]; if (!input) { - return []; + return new IntermediateStack(); } const stackId = input.block; return this.walkStack(stackId); @@ -1404,10 +1164,10 @@ class ScriptTreeGenerator { * Descend into and walk the siblings of a stack. * @param {string} startingBlockId The ID of the first block of a stack. * @private - * @returns {node[]} List of stacked block nodes. + * @returns {IntermediateStack} List of stacked block nodes. */ walkStack (startingBlockId) { - const result = []; + const result = new IntermediateStack(); let blockId = startingBlockId; while (blockId !== null) { @@ -1417,12 +1177,119 @@ class ScriptTreeGenerator { } const node = this.descendStackedBlock(block); - result.push(node); + this.script.yields = this.script.yields || node.yields; + result.blocks.push(node); + + blockId = block.next; + } + + return result; + } + + /** + * @param {*} block + * @returns {{ + * opcode: StackOpcode & InputOpcode, + * inputs?: *, + * yields: boolean + * }} + */ + getProcedureInfo (block) { + const procedureCode = block.mutation.proccode; + const paramNamesIdsAndDefaults = this.blocks.getProcedureParamNamesIdsAndDefaults(procedureCode); + + if (paramNamesIdsAndDefaults === null) { + return {opcode: StackOpcode.NOP, yields: false}; + } + + const [paramNames, paramIds, paramDefaults] = paramNamesIdsAndDefaults; + + const addonBlock = this.runtime.getAddonBlock(procedureCode); + if (addonBlock) { + const args = {}; + for (let i = 0; i < paramIds.length; i++) { + let value; + if (block.inputs[paramIds[i]] && block.inputs[paramIds[i]].block) { + value = this.descendInputOfBlock(block, paramIds[i], true); + } else { + value = this.createConstantInput(paramDefaults[i], true); + } + args[paramNames[i]] = value; + } + + return { + opcode: StackOpcode.ADDON_CALL, + inputs: { + code: procedureCode, + arguments: args, + blockId: block.id + }, + yields: true + }; + } + + const definitionId = this.blocks.getProcedureDefinition(procedureCode); + const definitionBlock = this.blocks.getBlock(definitionId); + if (!definitionBlock) { + return {opcode: StackOpcode.NOP, yields: false}; + } + const innerDefinition = this.blocks.getBlock(definitionBlock.inputs.custom_block.block); + + let isWarp = this.script.isWarp; + if (!isWarp) { + if (innerDefinition && innerDefinition.mutation) { + const warp = innerDefinition.mutation.warp; + if (typeof warp === 'boolean') { + isWarp = warp; + } else if (typeof warp === 'string') { + isWarp = JSON.parse(warp); + } + } + } + + const variant = generateProcedureVariant(procedureCode, isWarp); + + if (!this.script.dependedProcedures.includes(variant)) { + this.script.dependedProcedures.push(variant); + } + + const args = []; + for (let i = 0; i < paramIds.length; i++) { + let value; + if (block.inputs[paramIds[i]] && block.inputs[paramIds[i]].block) { + value = this.descendInputOfBlock(block, paramIds[i], true); + } else { + value = this.createConstantInput(paramDefaults[i], true); + } + args.push(value); + } + + return { + opcode: StackOpcode.PROCEDURE_CALL, + inputs: { + code: procedureCode, + variant, + arguments: args + }, + yields: !this.script.isWarp && procedureCode === this.script.procedureCode + }; + } - blockId = block.next; + /** + * @param {*} block + * @returns {IntermediateStackBlock | null} + */ + descendVisualReport (block) { + if (!this.thread.stackClick || block.next) { + return null; + } + try { + return new IntermediateStackBlock(StackOpcode.VISUAL_REPORT, { + input: this.descendInput(block) + }); + } catch (e) { + return null; } - - return result; } /** @@ -1437,21 +1304,23 @@ class ScriptTreeGenerator { const variable = block.fields[fieldName]; const id = variable.id; - if (Object.prototype.hasOwnProperty.call(this.variableCache, id)) { + if (id && Object.prototype.hasOwnProperty.call(this.variableCache, id)) { return this.variableCache[id]; } const data = this._descendVariable(id, variable.value, type); - this.variableCache[id] = data; + // If variable ID was null, this might do some unnecessary updates, but that is a rare + // edge case and it won't have any adverse effects anyways. + this.variableCache[String(data.id)] = data; return data; } /** - * @param {string} id The ID of the variable. + * @param {string|null} id The ID of the variable. * @param {string} name The name of the variable. * @param {''|'list'} type The variable type. * @private - * @returns {*} A parsed variable object. + * @returns {DescendedVariable} A parsed variable object. */ _descendVariable (id, name, type) { const target = this.target; @@ -1459,13 +1328,25 @@ class ScriptTreeGenerator { // Look for by ID in target... if (Object.prototype.hasOwnProperty.call(target.variables, id)) { - return createVariableData('target', target.variables[id]); + const currVar = target.variables[String(id)]; + return { + scope: 'target', + id: currVar.id, + name: currVar.name, + isCloud: currVar.isCloud + }; } // Look for by ID in stage... if (!target.isStage) { if (stage && Object.prototype.hasOwnProperty.call(stage.variables, id)) { - return createVariableData('stage', stage.variables[id]); + const currVar = stage.variables[String(id)]; + return { + scope: 'stage', + id: currVar.id, + name: currVar.name, + isCloud: currVar.isCloud + }; } } @@ -1474,7 +1355,12 @@ class ScriptTreeGenerator { if (Object.prototype.hasOwnProperty.call(target.variables, varId)) { const currVar = target.variables[varId]; if (currVar.name === name && currVar.type === type) { - return createVariableData('target', currVar); + return { + scope: 'target', + id: currVar.id, + name: currVar.name, + isCloud: currVar.isCloud + }; } } } @@ -1485,7 +1371,12 @@ class ScriptTreeGenerator { if (Object.prototype.hasOwnProperty.call(stage.variables, varId)) { const currVar = stage.variables[varId]; if (currVar.name === name && currVar.type === type) { - return createVariableData('stage', currVar); + return { + scope: 'stage', + id: currVar.id, + name: currVar.name, + isCloud: currVar.isCloud + }; } } } @@ -1493,7 +1384,10 @@ class ScriptTreeGenerator { // Create it locally... const newVariable = new Variable(id, name, type, false); - target.variables[id] = newVariable; + + // Intentionally not using newVariable.id so that this matches vanilla Scratch quirks regarding + // handling of null variable IDs. + target.variables[String(id)] = newVariable; if (target.sprite) { // Create the variable in all instances of this sprite. @@ -1501,135 +1395,129 @@ class ScriptTreeGenerator { // sprite.clones has all instances of this sprite including the original and all clones for (const clone of target.sprite.clones) { if (!Object.prototype.hasOwnProperty.call(clone.variables, id)) { - clone.variables[id] = new Variable(id, name, type, false); + clone.variables[String(id)] = new Variable(id, name, type, false); } } } - return createVariableData('target', newVariable); + return { + scope: 'target', + // If the given ID was null, this won't match the .id property of the Variable object. + // This is intentional to match vanilla Scratch quirks. + id, + name: newVariable.name, + isCloud: newVariable.isCloud + }; } /** - * Descend into a procedure call block. - * @param {*} block The procedure call block to parse. + * Descend into an input block that uses the compatibility layer. + * @param {*} block The block to use the compatibility layer for. * @private - * @returns {node} The parsed procedure call node. + * @returns {IntermediateInput} The parsed node. */ - descendProcedure (block) { - const procedureCode = block.mutation.proccode; - const paramNamesIdsAndDefaults = this.blocks.getProcedureParamNamesIdsAndDefaults(procedureCode); - if (paramNamesIdsAndDefaults === null) { - return { - kind: BLOCKS.NOOP - }; - } - - const [paramNames, paramIds, paramDefaults] = paramNamesIdsAndDefaults; - - const addonBlock = this.runtime.getAddonBlock(procedureCode); - if (addonBlock) { - this.script.yields = true; - const args = Object.create(null); - for (let i = 0; i < paramIds.length; i++) { - let value; - if (block.inputs[paramIds[i]] && block.inputs[paramIds[i]].block) { - value = this.descendInputOfBlock(block, paramIds[i]); - } else { - value = { - kind: BLOCKS.CONSTANT, - value: paramDefaults[i] - }; - } - args[paramNames[i]] = value; - } - return { - kind: BLOCKS.ADDONS.CALL, - code: block.code || procedureCode, - arguments: args, - blockId: block.id - }; + descendCompatLayerInput (block) { + const inputs = {}; + const fields = {}; + for (const name of Object.keys(block.inputs)) { + inputs[name] = this.descendInputOfBlock(block, name, true); } - - const definitionId = this.blocks.getProcedureDefinition(procedureCode); - const definitionBlock = this.blocks.getBlock(definitionId); - if (!definitionBlock) { - return { - kind: BLOCKS.NOOP - }; + for (const name of Object.keys(block.fields)) { + fields[name] = block.fields[name].value; } - const innerDefinition = this.blocks.getBlock(definitionBlock.inputs.custom_block.block); + return new IntermediateInput(InputOpcode.COMPATIBILITY_LAYER, InputType.ANY, { + opcode: block.opcode, + id: block.id, + inputs, + fields, + mutation: block.mutation + }, true); + } - let isWarp = this.script.isWarp; - if (!isWarp) { - if (innerDefinition && innerDefinition.mutation) { - const warp = innerDefinition.mutation.warp; - if (typeof warp === 'boolean') { - isWarp = warp; - } else if (typeof warp === 'string') { - isWarp = JSON.parse(warp); - } - } + /** + * Raw-source switch and case values stay uncoerced so spliced `case x:` + * statements and the discriminant compare with === on the original values. + * @param {*} block Switch, case, or fallthrough block. + * @returns {IntermediateInput} + */ + descendSwitchValue (block) { + const value = this.descendInputOfBlock(block, 'VALUE'); + if (value.opcode === InputOpcode.RAW_SOURCE) { + return value; } + return value.toType(InputType.STRING); + } - const variant = generateProcedureVariant(procedureCode, isWarp); + /** + * Preserve the source-splicing behavior used by legacy Mist's Utils projects. + * Literal text is JavaScript source; reporter inputs are compiled expressions. + * @param {*} block Patch block. + * @returns {IntermediateInput[]} + */ + descendRawSourceFragments (block) { + const variadic = Object.keys(block.inputs) + .filter(name => /^ARG\d+$/.test(name)) + .sort((a, b) => Number(a.substring(3)) - Number(b.substring(3))); + return (variadic.length ? variadic : ['A', 'B', 'C']) + .filter(name => block.inputs[name]) + .map(name => this.descendInputOfBlock(block, name, true)); + } - if (!this.script.dependedProcedures.includes(variant)) { - this.script.dependedProcedures.push(variant); - } + /** + * @param {*} block Patch reporter block. + * @param {number} type Compiler input type. + * @returns {IntermediateInput} + */ + descendRawSourceInput (block, type) { + return new IntermediateInput(InputOpcode.RAW_SOURCE, type, { + fragments: this.descendRawSourceFragments(block) + }); + } - // Non-warp direct recursion yields. - if (!this.script.isWarp) { - if (procedureCode === this.script.procedureCode) { - this.script.yields = true; - } + descendCompilerExtensionInput (block, compiler) { + const inputs = {}; + for (const name of Object.keys(block.inputs)) { + inputs[name] = this.descendInputOfBlock(block, name, true); } - - const args = []; - for (let i = 0; i < paramIds.length; i++) { - let value; - if (block.inputs[paramIds[i]] && block.inputs[paramIds[i]].block) { - value = this.descendInputOfBlock(block, paramIds[i]); - } else { - value = { - kind: BLOCKS.CONSTANT, - value: paramDefaults[i] - }; - } - args.push(value); + const fields = {}; + for (const name of Object.keys(block.fields)) { + fields[name] = block.fields[name].value; } + return new IntermediateInput(InputOpcode.EXTENSION, COMPILER_INPUT_TYPES[compiler.type], { + compiler, + inputs, + fields, + mutation: block.mutation || {} + }); + } - return { - kind: BLOCKS.PROCEDURES.CALL, - code: procedureCode, - variant, - arguments: args - }; + descendCompilerExtensionStack (block, compiler) { + const input = this.descendCompilerExtensionInput(block, Object.assign({}, compiler, {type: 'any'})); + return new IntermediateStackBlock(StackOpcode.EXTENSION, input.inputs); } /** - * Descend into a block that uses the compatibility layer. + * Descend into a stack block that uses the compatibility layer. * @param {*} block The block to use the compatibility layer for. * @private - * @returns {node} The parsed node. + * @returns {IntermediateStackBlock} The parsed node. */ - descendCompatLayer (block) { - this.script.yields = true; - - const inputs = Object.create(null); + descendCompatLayerStack (block) { + const inputs = {}; for (const name of Object.keys(block.inputs)) { if (!name.startsWith('SUBSTACK')) { - inputs[name] = this.descendInputOfBlock(block, name); + inputs[name] = this.descendInputOfBlock(block, name, true); } } - const fields = Object.create(null); + const fields = {}; for (const name of Object.keys(block.fields)) { fields[name] = block.fields[name].value; } const blockInfo = this.getBlockInfo(block.opcode); const blockType = (blockInfo && blockInfo.info && blockInfo.info.blockType) || BlockType.COMMAND; - const substacks = Object.create(null); + const substacks = {}; if (blockType === BlockType.CONDITIONAL || blockType === BlockType.LOOP) { for (const inputName in block.inputs) { if (!inputName.startsWith('SUBSTACK')) continue; @@ -1640,53 +1528,20 @@ class ScriptTreeGenerator { } } - if (!block.code) block.code = null; - - return { - kind: BLOCKS.COMPAT, - id: block.id, + return new IntermediateStackBlock(StackOpcode.COMPATIBILITY_LAYER, { opcode: block.opcode, + id: block.id, blockType, inputs, fields, - substacks, - code: block.code - }; - } - - descendCompiledExtension (block) { - const inputs = Object.create(null); - for (const name of Object.keys(block.inputs)) { - if (!name.startsWith('SUBSTACK')) { - inputs[name] = this.descendInputOfBlock(block, name); - } - } - - const fields = Object.create(null); - for (const name of Object.keys(block.fields)) { - fields[name] = block.fields[name].value; - } - - return { - kind: BLOCKS.EXTENSION, - opcode: block.opcode, - inputs, - fields - }; + substacks + }, true); } analyzeLoop () { - if (!this.script.isWarp || this.script.warpTimer) { - this.script.yields = true; - } + return !this.script.isWarp || this.script.warpTimer; } - /** - * Read the top block comment. - * @param {string} commentId The ID of the comment to read. - * @private - * @returns {void} - */ readTopBlockComment (commentId) { const comment = this.target.comments[commentId]; if (!comment) { @@ -1719,27 +1574,8 @@ class ScriptTreeGenerator { } /** - * Descend into a visual report block. - * @param {node} block The visual report block to parse. - * @private - * @returns {node|null} The parsed visual report node, or null if the block should be removed. - */ - descendVisualReport (block) { - if (!this.thread.stackClick || block.next) { - return null; - } - try { - return { - kind: BLOCKS.VISUAL_REPORT, - input: this.descendInput(block) - }; - } catch (e) { - return null; - } - } - - /** - * @param {node} hatBlock + * @param {*} hatBlock + * @returns {IntermediateStack} */ walkHat (hatBlock) { const nextBlock = hatBlock.next; @@ -1751,10 +1587,10 @@ class ScriptTreeGenerator { // interpreter parity, but the reuslt is ignored. const opcodeFunction = this.runtime.getOpcodeFunction(opcode); if (opcodeFunction) { - return [ - this.descendCompatLayer(hatBlock), - ...this.walkStack(nextBlock) - ]; + return new IntermediateStack([ + this.descendCompatLayerStack(hatBlock), + ...this.walkStack(nextBlock).blocks + ]); } return this.walkStack(nextBlock); } @@ -1763,14 +1599,13 @@ class ScriptTreeGenerator { // Edge-activated HAT this.script.yields = true; this.script.executableHat = true; - return [ - { - kind: BLOCKS.HAT.EDGE, + return new IntermediateStack([ + new IntermediateStackBlock(StackOpcode.HAT_EDGE, { id: hatBlock.id, - condition: this.descendCompatLayer(hatBlock) - }, - ...this.walkStack(nextBlock) - ]; + condition: this.descendCompatLayerInput(hatBlock).toType(InputType.BOOLEAN) + }), + ...this.walkStack(nextBlock).blocks + ]); } const opcodeFunction = this.runtime.getOpcodeFunction(opcode); @@ -1778,13 +1613,12 @@ class ScriptTreeGenerator { // Predicate-based HAT this.script.yields = true; this.script.executableHat = true; - return [ - { - kind: BLOCKS.HAT.PREDICATE, - condition: this.descendCompatLayer(hatBlock) - }, - ...this.walkStack(nextBlock) - ]; + return new IntermediateStack([ + new IntermediateStackBlock(StackOpcode.HAT_PREDICATE, { + condition: this.descendCompatLayerInput(hatBlock).toType(InputType.BOOLEAN) + }), + ...this.walkStack(nextBlock).blocks + ]); } return this.walkStack(nextBlock); @@ -1837,9 +1671,6 @@ class ScriptTreeGenerator { } class IRGenerator { - /** - * @param {Thread} thread The thread to generate IR for. - */ constructor (thread) { this.thread = thread; this.blocks = thread.blockContainer; @@ -1849,17 +1680,9 @@ class IRGenerator { /** @type {Object.} */ this.procedures = {}; - /** A list of procedure ids that have been analyzed. - * @type {string[]} - */ - this.analyzedProcedures = []; + this.analyzedProcedures = new Set(); } - /** - * Add dependencies for a procedure. - * @param {string[]} dependencies The dependencies to add. - * @returns {void} - */ addProcedureDependencies (dependencies) { for (const procedureVariant of dependencies) { if (Object.prototype.hasOwnProperty.call(this.procedures, procedureVariant)) { @@ -1898,12 +1721,11 @@ class IRGenerator { const procedureData = this.procedures[procedureCode]; // Analyze newly found procedures. - if (!this.analyzedProcedures.includes(procedureCode)) { - this.analyzedProcedures.push(procedureCode); + if (!this.analyzedProcedures.has(procedureCode)) { + this.analyzedProcedures.add(procedureCode); if (this.analyzeScript(procedureData)) { madeChanges = true; } - this.analyzedProcedures.pop(); } // If a procedure used by a script may yield, the script itself may yield. @@ -1945,403 +1767,13 @@ class IRGenerator { } } - while (this.analyzeScript(entry)); - - this.optimizeScript(entry); - for (const code of Object.keys(this.procedures)) { - this.optimizeScript(this.procedures[code]); - } - - const ir = new IntermediateRepresentation(entry); - ir.procedures = this.procedures; - return ir; - } - - /** - * Optimize a script. - * @param {*} script The script to optimize. - * @private - * @returns {*} The optimized script. - */ - optimizeScript (script) { - /** - * @param {node[]} nodes The nodes to optimize. - * @returns {node[]} The optimized nodes. - */ - const optimizeStack = nodes => { - if (!nodes || !nodes.length) return []; - const out = []; - let prev = null; - for (let i = 0; i < nodes.length; i++) { - const chain = this._tryConvertEqualsIfChain(nodes, i); - if (chain) { - const {converted, count} = chain; - for (const nn of converted) { - if (!this._isDuplicate(prev, nn)) { - out.push(nn); - prev = nn; - } - } - i += (count - 1); - continue; - } - const node = nodes[i]; - const n = this.optimizeNode(node); - if (!n) continue; - if (Array.isArray(n)) { - for (const nn of n) { - if (!nn) continue; - if (!this._isDuplicate(prev, nn)) { - out.push(nn); - prev = nn; - } - } - continue; - } - if (!this._isDuplicate(prev, n)) { - out.push(n); - prev = n; - } - } - return out; - }; - script.stack = optimizeStack(script.stack); - } - - /** - * Optimize a node. - * @param {node} node The node to optimize. - * @private - * @returns {node|null} The optimized node, or null if the node should be removed. - */ - optimizeNode (node) { - if (!node) return null; - switch (node.kind) { - case BLOCKS.NOOP: - return null; - case BLOCKS.CONTROL.IF: { - const cond = node.condition; - if (cond && cond.kind === BLOCKS.CONSTANT) { - const stack = cond.value ? node.whenTrue : node.whenFalse; - node.whenTrue = this._optimizeSubstack(stack); - node.value = true; - return node; - } - node.whenTrue = this._optimizeSubstack(node.whenTrue); - if (node.whenFalse) node.whenFalse = this._optimizeSubstack(node.whenFalse); - return node; - } - case BLOCKS.CONTROL.REPEAT: { - node.do = this._optimizeSubstack(node.do); - return node; - } - case BLOCKS.CONTROL.WHILE: { - const cond = node.condition; - if (cond && cond.kind === BLOCKS.CONSTANT) { - const v = !!cond.value; - if (!v) return null; - } - node.do = this._optimizeSubstack(node.do); - return node; - } - case BLOCKS.CONTROL.SWITCH: - case BLOCKS.CONTROL.CASE: - case BLOCKS.CONTROL.DEFAULT: { - node.do = this._optimizeSubstack(node.do); - return node; - } - case BLOCKS.VAR.SET: { - node.value = this.optimizeInput(node.value); - return node; - } - case BLOCKS.LIST.ADD: - case BLOCKS.LIST.INSERT: - case BLOCKS.LIST.REPLACE: { - node.index = this.optimizeInput(node.index); - node.item = this.optimizeInput(node.item); - return node; - } - } - return node; - } - - /** - * Optimize a stack. - * @param {node[]} stack The stack to optimize. - * @private - * @returns {node[]} The optimized stack. - */ - _optimizeSubstack (stack) { - if (!stack || !stack.length) return []; - const out = []; - let prev = null; - for (const node of stack) { - const n = this.optimizeNode(node); - if (!n) continue; - if (Array.isArray(n)) { - for (const nn of n) { - if (!nn) continue; - if (!this._isDuplicate(prev, nn)) { - out.push(nn); - prev = nn; - } - } - } else if (!this._isDuplicate(prev, n)) { - out.push(n); - prev = n; - } - } - return out; - } - - /** - * Check if two nodes are duplicates. - * @param {node} prev The previous node. - * @param {node} next The next node. - * @private - * @returns {boolean} True if the nodes are duplicates. - */ - _isDuplicate (prev, next) { - if (!prev || !next) return false; - if (prev.kind !== next.kind) return false; - switch (next.kind) { - case BLOCKS.LIST.DELETE_ALL: - return prev.list && next.list && prev.list.id === next.list.id; - case BLOCKS.LIST.SHOW: - case BLOCKS.LIST.HIDE: - return prev.list && next.list && prev.list.id === next.list.id; - case BLOCKS.VAR.SHOW: - case BLOCKS.VAR.HIDE: - return prev.variable && next.variable && prev.variable.id === next.variable.id; - case BLOCKS.LOOKS.CLEAR_EFFECTS: - case BLOCKS.LOOKS.GOTO_FRONT: - case BLOCKS.LOOKS.GOTO_BACK: - case BLOCKS.LOOKS.SHOW: - case BLOCKS.LOOKS.HIDE: - return true; - default: - return false; - } - } - - /** - * Get a unique key for a node. - * @param {node} node The node to get a key for. - * @private - * @returns {string} The unique key for the node. - */ - _nodeKey (node) { - try { - return JSON.stringify(node); - } catch (_e) { - return ''; - } - } - - /** - * Try to convert an equals if chain into a switch. - * @param {node[]} nodes The nodes to convert. - * @param {number} startIndex The index to start converting from. - * @private - * @returns {object|null} The converted node, or null if the conversion failed. - */ - _switchKeyOfCondition (cond) { - if (!cond) return null; - if (cond.kind === BLOCKS.OP.EQUALS) { - if (!cond.right || cond.right.kind !== BLOCKS.CONSTANT) return null; - return this._nodeKey(cond.left); - } - if (cond.kind === BLOCKS.OP.OR) { - return this._switchKeyOfCondition(cond.left); - } - return null; - } - - // The `=` if-chain evaluates the subject once per branch, but a switch evaluates it once. - // Only convert when the subject is a read whose value can't change between those evaluations - // and that has no side effects -- otherwise e.g. `pick random` would be drawn once instead of - // once per branch. These reporters take no value inputs, so they are unconditionally stable. - _isStableSwitchSubject (cond) { - if (!cond) return false; - if (cond.kind === BLOCKS.OP.EQUALS) { - const left = cond.left; - return !!left && ( - left.kind === BLOCKS.VAR.GET || - left.kind === BLOCKS.SENSING.ANSWER || - left.kind === BLOCKS.LIST.CONTENTS - ); - } - if (cond.kind === BLOCKS.OP.OR) { - return this._isStableSwitchSubject(cond.left); - } - return false; - } - - _collectEqualsValues (cond, leftKey, out) { - if (!cond) return false; - if (cond.kind === BLOCKS.OP.EQUALS) { - if (this._nodeKey(cond.left) !== leftKey) return false; - if (!cond.right || cond.right.kind !== BLOCKS.CONSTANT) return false; - out.push(cond.right); - return true; - } - if (cond.kind === BLOCKS.OP.OR) { - return this._collectEqualsValues(cond.left, leftKey, out) && - this._collectEqualsValues(cond.right, leftKey, out); - } - return false; - } - - _tryConvertEqualsIfChain (nodes, startIndex) { - const first = nodes[startIndex]; - if (!first || first.kind !== BLOCKS.CONTROL.IF) return null; - if (first.whenFalse && first.whenFalse.length) return null; - const leftKey = this._switchKeyOfCondition(first.condition); - if (leftKey === null || leftKey === '') return null; - if (!this._isStableSwitchSubject(first.condition)) return null; - - const cases = []; - let i = startIndex; - while (i < nodes.length) { - const n = nodes[i]; - if (!n || n.kind !== BLOCKS.CONTROL.IF) break; - if (n.whenFalse && n.whenFalse.length) break; - const values = []; - if (!this._collectEqualsValues(n.condition, leftKey, values) || !values.length) break; - cases.push({values, body: this._optimizeSubstack(n.whenTrue)}); - i += 1; - } - if (cases.length < 2) return null; - - for (const cs of cases) { - const last = cs.body[cs.body.length - 1]; - if (last && - last.kind !== BLOCKS.CONTROL.BREAK && - last.kind !== BLOCKS.CONTROL.STOP_SCRIPT && - last.kind !== BLOCKS.PROCEDURES.RETURN) { - return null; - } - } - - // A JS switch can only reproduce Scratch's `=` if every label is compared the same way. - // Scratch compares numerically only when both sides are numbers, and compares strings - // case-insensitively otherwise, so a mix of numeric and non-numeric labels cannot be - // expressed as one switch. - let numericLabels = 0; - let stringLabels = 0; - for (const cs of cases) { - for (const v of cs.values) { - if (v.kind !== BLOCKS.CONSTANT) return null; - if (isSwitchNumberLabel(v.value)) { - numericLabels += 1; - } else if (isSwitchStringLabel(v.value)) { - stringLabels += 1; - } else { - return null; - } - } - } - if (numericLabels && stringLabels) return null; - const allNumbers = stringLabels === 0; - - const switchBody = []; - for (const cs of cases) { - for (let vi = 0; vi < cs.values.length; vi++) { - const cur = cs.values[vi]; - cur.value = allNumbers ? +cur.value : `${cur.value}`.toLowerCase(); - if (vi === cs.values.length - 1) { - switchBody.push({ - kind: BLOCKS.CONTROL.CASE, - value: cur, - do: cs.body, - useNumbers: allNumbers - }); - } else { - switchBody.push({ - kind: BLOCKS.CONTROL.CASE_FALLTHROUGH, - value: cur, - useNumbers: allNumbers - }); - } - } - } - - const switchNode = { - kind: BLOCKS.CONTROL.SWITCH, - value: JSON.parse(leftKey), - do: switchBody, - useNumbers: allNumbers - }; - return { - converted: [switchNode], - count: cases.length - }; - } - - /** - * Optimize an input. - * @param {node} node The input to optimize. - * @private - * @returns {node} The optimized input. - */ - optimizeInput (node) { - if (!node) return node; - switch (node.kind) { - case BLOCKS.OP.ADD: - case BLOCKS.OP.SUBTRACT: - case BLOCKS.OP.MULTIPLY: - case BLOCKS.OP.DIVIDE: - case BLOCKS.OP.MOD: - return this._optimizeArithmetic(node); - } - return node; - } - - /** - * Optimize an arithmetic node. - * @param {node} node The arithmetic node to optimize. - * @private - * @returns {node} The optimized arithmetic node. - */ - _optimizeArithmetic (node) { - const left = this.optimizeInput(node.left); - const right = this.optimizeInput(node.right); - node.left = left; - node.right = right; - if (left && right && left.kind === BLOCKS.CONSTANT && right.kind === BLOCKS.CONSTANT) { - const a = +left.value || 0; - const b = +right.value || 0; - if (Number.isFinite(a) && Number.isFinite(b) && a !== 0 && b !== 0) { - switch (node.kind) { - case BLOCKS.OP.ADD: - return {kind: BLOCKS.CONSTANT, value: (a + b)}; - case BLOCKS.OP.SUBTRACT: - return {kind: BLOCKS.CONSTANT, value: (a - b)}; - case BLOCKS.OP.MULTIPLY: - return {kind: BLOCKS.CONSTANT, value: (a * b)}; - case BLOCKS.OP.DIVIDE: - return {kind: BLOCKS.CONSTANT, value: (a / b)}; - case BLOCKS.OP.MOD: - return {kind: BLOCKS.CONSTANT, value: (a % b)}; - } - } + // Analyze scripts until no changes are made. + while (this.analyzeScript(entry)) { + // Reset so all procedures get re-examined each pass. + this.analyzedProcedures = new Set(); } - return node; - } - /** - * Optimize a length node. - * @param {node} node The length node to optimize. - * @private - * @returns {node} The optimized length node. - */ - _optimizeLength (node) { - const s = this.optimizeInput(node.string); - node.string = s; - if (s && s.kind === BLOCKS.CONSTANT) { - return {kind: BLOCKS.CONSTANT, value: ((`${s.value}`).length).toString()}; - } - return node; + return new IntermediateRepresentation(entry, this.procedures); } } diff --git a/src/compiler/iroptimizer.js b/src/compiler/iroptimizer.js index 23e96c13192..28d8dae777f 100644 --- a/src/compiler/iroptimizer.js +++ b/src/compiler/iroptimizer.js @@ -1,622 +1,837 @@ -const {BLOCKS} = require('./enums'); - -class IROptimizer { +// @ts-check + +const {StackOpcode, InputOpcode, InputType} = require('./enums.js'); +const log = require('../util/log'); + +// These imports are used by jsdoc comments but eslint doesn't know that +/* eslint-disable no-unused-vars */ +const { + IntermediateStack, + IntermediateInput, + IntermediateScript, + IntermediateRepresentation, + IntermediateStackBlock +} = require('./intermediate'); +/* eslint-enable no-unused-vars */ + +class TypeState { constructor () { - /** - * @type {Object. | null} - * @private - */ - this._procedures = null; - - /** - * @type {Map | null} - * @private - */ - this._inlineableProcedures = null; + /** @type {Object.}*/ + this.variables = Object.create(null); } /** - * Optimize a script. - * @param {*} script The script to optimize. - * @param {Object.=} procedures - * All known procedures keyed by variant. - * @returns {*} The optimized script. + * @returns {boolean} */ - optimizeScript (script, procedures) { - this._procedures = procedures || null; - this._inlineableProcedures = this._procedures ? this._computeInlineableProcedures(this._procedures) : null; - - /** - * @param {node[]} nodes The nodes to optimize. - * @returns {node[]} The optimized nodes. - */ - const optimizeStack = nodes => { - if (!nodes || !nodes.length) return []; - const out = []; - let prev = null; - for (let i = 0; i < nodes.length; i++) { - const chain = this._tryConvertEqualsIfChain(nodes, i); - if (chain) { - const {converted, count} = chain; - for (const nn of converted) { - if (!this._isDuplicate(prev, nn)) { - out.push(nn); - prev = nn; - } - } - i += (count - 1); - continue; - } - const node = nodes[i]; - const n = this.optimizeNode(node); - if (!n) continue; - if (Array.isArray(n)) { - for (const nn of n) { - if (!nn) continue; - if (!this._isDuplicate(prev, nn)) { - out.push(nn); - prev = nn; - } - } - continue; - } - if (!this._isDuplicate(prev, n)) { - out.push(n); - prev = n; - } + clear () { + let modified = false; + for (const varId in this.variables) { + if (this.variables[varId] !== InputType.ANY) { + modified = true; + break; } - return out; - }; - script.stack = optimizeStack(script.stack); - return script; + } + this.variables = Object.create(null); + return modified; } + /** - * Optimize a node. - * @param {node} node The node to optimize. - * @private - * @returns {node|null} The optimized node, or null if the node should be removed. + * @returns {TypeState} */ - optimizeNode (node) { - if (!node) return null; - switch (node.kind) { - case BLOCKS.NOOP: - return null; - case BLOCKS.CONTROL.IF: { - const cond = node.condition; - if (cond && cond.kind === BLOCKS.CONSTANT) { - const stack = cond.value ? node.whenTrue : node.whenFalse; - node.whenTrue = this._optimizeSubstack(stack); - node.value = true; - return node; - } - node.whenTrue = this._optimizeSubstack(node.whenTrue); - if (node.whenFalse) node.whenFalse = this._optimizeSubstack(node.whenFalse); - return node; - } - case BLOCKS.CONTROL.REPEAT: { - node.times = this.optimizeInput(node.times); - node.do = this._optimizeSubstack(node.do); - return node; - } - case BLOCKS.CONTROL.WHILE: { - const cond = node.condition; - if (cond && cond.kind === BLOCKS.CONSTANT) { - const v = !!cond.value; - if (!v) return null; - } - node.do = this._optimizeSubstack(node.do); - return node; - } - case BLOCKS.CONTROL.SWITCH: - case BLOCKS.CONTROL.CASE: - case BLOCKS.CONTROL.DEFAULT: { - node.do = this._optimizeSubstack(node.do); - return node; - } - case BLOCKS.VAR.SET: { - node.value = this.optimizeInput(node.value); - return node; - } - case BLOCKS.LIST.ADD: - case BLOCKS.LIST.INSERT: - case BLOCKS.LIST.REPLACE: { - node.index = this.optimizeInput(node.index); - node.item = this.optimizeInput(node.item); - return node; - } - default: - return this.optimizeInputs(node); + clone () { + const clone = new TypeState(); + for (const varId in this.variables) { + clone.variables[varId] = this.variables[varId]; } + return clone; } /** - * Optimize a stack. - * @param {node[]} stack The stack to optimize. + * @param {TypeState} other + * @param {(varId: string) => InputType | 0} stateMutator + * @returns {boolean} * @private - * @returns {node[]} The optimized stack. */ - _optimizeSubstack (stack) { - if (!stack || !stack.length) return []; - const out = []; - let prev = null; - for (const node of stack) { - const n = this.optimizeNode(node); - if (!n) continue; - if (Array.isArray(n)) { - for (const nn of n) { - if (!nn) continue; - if (!this._isDuplicate(prev, nn)) { - out.push(nn); - prev = nn; - } + mutate (other, stateMutator) { + let modified = false; + for (const varId in other.variables) { + const newValue = stateMutator(varId); + if (newValue !== this.variables[varId]) { + this.variables[varId] = newValue; + modified = modified || true; + } + } + + for (const varId in this.variables) { + if (!other.variables[varId]) { + const newValue = stateMutator(varId); + if (newValue !== this.variables[varId]) { + this.variables[varId] = newValue; + modified = modified || true; } - } else if (!this._isDuplicate(prev, n)) { - out.push(n); - prev = n; } } - return out; + return modified; } /** - * Check if two nodes are duplicates. - * @param {node} prev The previous node. - * @param {node} next The next node. - * @private - * @returns {boolean} True if the nodes are duplicates. + * @param {TypeState} other + * @returns {boolean} */ - _isDuplicate (prev, next) { - if (!prev || !next) return false; - if (prev.kind !== next.kind) return false; - switch (next.kind) { - case BLOCKS.LIST.DELETE_ALL: - return prev.list && next.list && prev.list.id === next.list.id; - case BLOCKS.LIST.SHOW: - case BLOCKS.LIST.HIDE: - return prev.list && next.list && prev.list.id === next.list.id; - case BLOCKS.VAR.SHOW: - case BLOCKS.VAR.HIDE: - return prev.variable && next.variable && prev.variable.id === next.variable.id; - case BLOCKS.LOOKS.CLEAR_EFFECTS: - case BLOCKS.LOOKS.GOTO_FRONT: - case BLOCKS.LOOKS.GOTO_BACK: - case BLOCKS.LOOKS.SHOW: - case BLOCKS.LOOKS.HIDE: - return true; - default: - return false; - } + or (other) { + return this.mutate(other, varId => { + const thisType = this.variables[varId] ?? InputType.ANY; + const otherType = other.variables[varId] ?? InputType.ANY; + return thisType | otherType; + }); } /** - * Get a unique key for a node. - * @param {node} node The node to get a key for. - * @private - * @returns {string} The unique key for the node. + * @param {TypeState} other + * @returns {boolean} */ - _nodeKey (node) { - try { - return JSON.stringify(node); - } catch (_e) { - return ''; - } + after (other) { + return this.mutate(other, varId => { + const otherType = other.variables[varId]; + if (otherType) return otherType; + return this.variables[varId] ?? InputType.ANY; + }); } /** - * Optimize the inputs of a node. - * @param {node} node The node to optimize. - * @private - * @returns {node} The optimized node. + * @param {TypeState} other + * @returns {boolean} */ - optimizeInputs (node) { - if (!node) return node; - for (const k of Object.keys(node)) { - const v = node[k]; - if (v && typeof v === 'object' && v.kind) { - node[k] = this.optimizeInput(v); - } - } - return node; + overwrite (other) { + return this.mutate(other, varId => other.variables[varId] ?? InputType.ANY); } /** - * Optimize an input. - * @param {node} node The input to optimize. - * @private - * @returns {node} The optimized input. + * @param {*} variable A variable codegen object. + * @param {InputType} type The type to set this variable to + * @returns {boolean} */ - optimizeInput (node) { - if (!node) return node; - switch (node.kind) { - case BLOCKS.OP.ADD: - case BLOCKS.OP.SUBTRACT: - case BLOCKS.OP.MULTIPLY: - case BLOCKS.OP.DIVIDE: - case BLOCKS.OP.MOD: - return this._optimizeArithmetic(node); - case BLOCKS.OP.LENGTH: - return this._optimizeLength(node); - case BLOCKS.OP.JOIN: - return this._optimizeJoin(node); - case BLOCKS.OP.NOT: - return this._optimizeNot(node); - case BLOCKS.PROCEDURES.CALL: { - // Ensure procedure call arguments get optimized (they live in an array). - if (Array.isArray(node.arguments)) { - node.arguments = node.arguments.map(arg => this.optimizeInput(arg)); - } - - const inlined = this._tryInlineProcedureCall(node); - if (inlined) { - // The inlined expression may now be optimizable (e.g. constant folding) - return this.optimizeInput(inlined); - } - return node; - } - default: - return this.optimizeInputs(node); - } + setVariableType (variable, type) { + if (this.variables[variable.id] === type) return false; + this.variables[variable.id] = type; + return true; } /** - * @param {Object.} procedures - * @returns {Map} - * @private + * + * @param {*} variable A variable codegen object. + * @returns {InputType} */ - _computeInlineableProcedures (procedures) { - const result = new Map(); - for (const variant of Object.keys(procedures)) { - const proc = procedures[variant]; - const info = this._getReturnOnlyProcedureInfo(proc); - if (!info) continue; - result.set(variant, info); - } - return result; + getVariableType (variable) { + return this.variables[variable.id] ?? InputType.ANY; } +} + +class IROptimizer { /** - * A procedure is inlineable if: - * - it cannot yield - * - its body is exactly `return ` (ignoring NOOPs) - * @param {import('./intermediate').IntermediateScript} proc - * @returns {{returnValue: node} | null} - * @private + * @param {IntermediateRepresentation} ir */ - _getReturnOnlyProcedureInfo (proc) { - if (!proc || !proc.isProcedure) return null; - if (proc.yields) return null; - // If there are any arguments, don't inline. - if (Array.isArray(proc.arguments) && proc.arguments.length > 0) return null; - if (!Array.isArray(proc.stack)) return null; - - const filtered = proc.stack.filter(n => n && n.kind !== BLOCKS.NOOP); - if (filtered.length !== 1) return null; - const only = filtered[0]; - if (!only || only.kind !== BLOCKS.PROCEDURES.RETURN) return null; - if (!only.value || typeof only.value !== 'object') return null; - - // Don't inline if the returned expression calls another procedure. - if (this._containsAnyCall(only.value)) return null; - - return {returnValue: only.value}; + constructor (ir) { + /** @type {IntermediateRepresentation} */ + this.ir = ir; + /** @type {boolean} Used for testing */ + this.ignoreYields = false; + + /** @private @type {TypeState | null} The state the analyzed script could exit in */ + this.exitState = null; } /** - * @param {node} callNode - * @returns {node|null} - * @private + * @param {IntermediateInput} inputBlock + * @param {TypeState} state + * @returns {InputType} */ - _tryInlineProcedureCall (callNode) { - if (!this._procedures || !this._inlineableProcedures) return null; - if (!callNode || callNode.kind !== BLOCKS.PROCEDURES.CALL) return null; - const variant = callNode.variant; - if (!variant || typeof variant !== 'string') return null; + getInputType (inputBlock, state) { + const inputs = inputBlock.inputs; - const inlineInfo = this._inlineableProcedures.get(variant); - if (!inlineInfo) return null; + switch (inputBlock.opcode) { + case InputOpcode.VAR_GET: + return state.getVariableType(inputs.variable); - // Avoid infinite expansion if the return expression calls itself. - if (this._containsProcedureVariant(inlineInfo.returnValue, variant)) { - return null; + case InputOpcode.ADDON_CALL: + break; + + case InputOpcode.CAST_BOOLEAN: { + const innerType = inputs.target.type; + if (innerType & InputType.BOOLEAN) return innerType; + return InputType.BOOLEAN; } - const proc = this._procedures[variant]; - const args = Array.isArray(callNode.arguments) ? callNode.arguments : []; - const argCount = Array.isArray(proc.arguments) ? proc.arguments.length : 0; - if (args.length !== argCount) { - // Shouldn't happen, but avoid mis-substitution. - return null; + case InputOpcode.CAST_NUMBER: { + const innerType = inputs.target.type; + if (innerType & InputType.NUMBER) return innerType; + return InputType.NUMBER; } - // Basic safety: don't inline if any argument contains a procedure/addon call. - for (const arg of args) { - if (this._containsAnyCall(arg)) return null; + case InputOpcode.CAST_NUMBER_INDEX: { + const innerType = inputs.target.type; + if (innerType & InputType.NUMBER_INDEX) return innerType; + return InputType.NUMBER_INDEX; } - return this._cloneAndSubstituteArguments(inlineInfo.returnValue, args); - } + case InputOpcode.CAST_NUMBER_OR_NAN: { + const innerType = inputs.target.type; + if (innerType & InputType.NUMBER_OR_NAN) return innerType; + return InputType.NUMBER_OR_NAN; + } - /** - * @param {node} node - * @param {node[]} args - * @returns {node} - * @private - */ - _cloneAndSubstituteArguments (node, args) { - if (!node || typeof node !== 'object') return node; - if (node.kind === BLOCKS.PROCEDURES.ARGUMENT) { - const idx = node.index; - if (typeof idx === 'number' && idx >= 0 && idx < args.length) { - return this._deepClone(args[idx]); + case InputOpcode.CAST_STRING: { + const innerType = inputs.target.type; + if (innerType & InputType.STRING) return innerType; + return InputType.STRING; + } + + case InputOpcode.OP_ADD: { + const leftType = inputs.left.type; + const rightType = inputs.right.type; + + let resultType = 0; + + const canBeNaN = function () { + // Infinity + (-Infinity) = NaN + if ((leftType & InputType.NUMBER_POS_INF) && (rightType & InputType.NUMBER_NEG_INF)) return true; + // (-Infinity) + Infinity = NaN + if ((leftType & InputType.NUMBER_NEG_INF) && (rightType & InputType.NUMBER_POS_INF)) return true; + }; + if (canBeNaN()) resultType |= InputType.NUMBER_NAN; + + const canBeFractional = function () { + // For the plus operation to return a non-whole number one of it's + // inputs has to be a non-whole number + if (leftType & InputType.NUMBER_FRACT) return true; + if (rightType & InputType.NUMBER_FRACT) return true; + }; + const canBeFract = canBeFractional(); + + const canBePos = function () { + if (leftType & InputType.NUMBER_POS) return true; // POS + ANY ~= POS + if (rightType & InputType.NUMBER_POS) return true; // ANY + POS ~= POS + }; + if (canBePos()) { + resultType |= InputType.NUMBER_POS_INT | InputType.NUMBER_POS_INF; + if (canBeFract) resultType |= InputType.NUMBER_POS_FRACT; + } + + const canBeNeg = function () { + if (leftType & InputType.NUMBER_NEG) return true; // NEG + ANY ~= NEG + if (rightType & InputType.NUMBER_NEG) return true; // ANY + NEG ~= NEG + }; + if (canBeNeg()) { + resultType |= InputType.NUMBER_NEG_INT | InputType.NUMBER_NEG_INF; + if (canBeFract) resultType |= InputType.NUMBER_NEG_FRACT; } - return {kind: BLOCKS.CONSTANT, value: 0}; + + const canBeZero = function () { + // POS_REAL + NEG_REAL ~= 0 + if ((leftType & InputType.NUMBER_POS_REAL) && (rightType & InputType.NUMBER_NEG_REAL)) return true; + // NEG_REAL + POS_REAL ~= 0 + if ((leftType & InputType.NUMBER_NEG_REAL) && (rightType & InputType.NUMBER_POS_REAL)) return true; + // 0 + 0 = 0 + if ((leftType & InputType.NUMBER_ZERO) && (rightType & InputType.NUMBER_ZERO)) return true; + // 0 + -0 = 0 + if ((leftType & InputType.NUMBER_ZERO) && (rightType & InputType.NUMBER_NEG_ZERO)) return true; + // -0 + 0 = 0 + if ((leftType & InputType.NUMBER_NEG_ZERO) && (rightType & InputType.NUMBER_ZERO)) return true; + }; + if (canBeZero()) resultType |= InputType.NUMBER_ZERO; + + const canBeNegZero = function () { + // -0 + -0 = -0 + if ((leftType & InputType.NUMBER_NEG_ZERO) && (rightType & InputType.NUMBER_NEG_ZERO)) return true; + }; + if (canBeNegZero()) resultType |= InputType.NUMBER_NEG_ZERO; + + return resultType; } - if (Array.isArray(node)) { - // Shouldn't happen for nodes, but handle defensively. - return /** @type {any} */ (node.map(n => this._cloneAndSubstituteArguments(n, args))); + case InputOpcode.OP_SUBTRACT: { + const leftType = inputs.left.type; + const rightType = inputs.right.type; + + let resultType = 0; + + const canBeNaN = function () { + // Infinity - Infinity = NaN + if ((leftType & InputType.NUMBER_POS_INF) && (rightType & InputType.NUMBER_POS_INF)) return true; + // (-Infinity) - (-Infinity) = NaN + if ((leftType & InputType.NUMBER_NEG_INF) && (rightType & InputType.NUMBER_NEG_INF)) return true; + }; + if (canBeNaN()) resultType |= InputType.NUMBER_NAN; + + const canBeFractional = function () { + // For the subtract operation to return a non-whole number one of it's + // inputs has to be a non-whole number + if (leftType & InputType.NUMBER_FRACT) return true; + if (rightType & InputType.NUMBER_FRACT) return true; + }; + const canBeFract = canBeFractional(); + + const canBePos = function () { + if (leftType & InputType.NUMBER_POS) return true; // POS - ANY ~= POS + if (rightType & InputType.NUMBER_NEG) return true; // ANY - NEG ~= POS + }; + if (canBePos()) { + resultType |= InputType.NUMBER_POS_INT | InputType.NUMBER_POS_INF; + if (canBeFract) resultType |= InputType.NUMBER_POS_FRACT; + } + + const canBeNeg = function () { + if (leftType & InputType.NUMBER_NEG) return true; // NEG - ANY ~= NEG + if (rightType & InputType.NUMBER_POS) return true; // ANY - POS ~= NEG + }; + if (canBeNeg()) { + resultType |= InputType.NUMBER_NEG_INT | InputType.NUMBER_NEG_INF; + if (canBeFract) resultType |= InputType.NUMBER_NEG_FRACT; + } + + const canBeZero = function () { + // POS_REAL - POS_REAL ~= 0 + if ((leftType & InputType.NUMBER_POS_REAL) && (rightType & InputType.NUMBER_POS_REAL)) return true; + // NEG_REAL - NEG_REAL ~= 0 + if ((leftType & InputType.NUMBER_NEG_REAL) && (rightType & InputType.NUMBER_NEG_REAL)) return true; + // 0 - 0 = 0 + if ((leftType & InputType.NUMBER_ZERO) && (rightType & InputType.NUMBER_ZERO)) return true; + // 0 - (-0) = 0 + if ((leftType & InputType.NUMBER_ZERO) && (rightType & InputType.NUMBER_NEG_ZERO)) return true; + // (-0) - (-0) = 0 + if ((leftType & InputType.NUMBER_NEG_ZERO) && (rightType & InputType.NUMBER_NEG_ZERO)) return true; + }; + if (canBeZero()) resultType |= InputType.NUMBER_ZERO; + + const canBeNegZero = function () { + // (-0) - 0 = -0 + if ((leftType & InputType.NUMBER_NEG_ZERO) && (rightType & InputType.NUMBER_ZERO)) return true; + }; + if (canBeNegZero()) resultType |= InputType.NUMBER_NEG_ZERO; + + return resultType; } - const out = {}; - for (const k of Object.keys(node)) { - const v = node[k]; - if (v && typeof v === 'object') { - out[k] = this._cloneAndSubstituteArguments(v, args); - } else { - out[k] = v; + case InputOpcode.OP_MULTIPLY: { + const leftType = inputs.left.type; + const rightType = inputs.right.type; + + let resultType = 0; + + const canBeNaN = function () { + // (-)Infinity * 0 = NaN + if ((leftType & InputType.NUMBER_INF) && (rightType & InputType.NUMBER_ANY_ZERO)) return true; + // 0 * (-)Infinity = NaN + if ((leftType & InputType.NUMBER_ANY_ZERO) && (rightType & InputType.NUMBER_INF)) return true; + }; + if (canBeNaN()) resultType |= InputType.NUMBER_NAN; + + const canBeFractional = function () { + // For the subtract operation to return a non-whole number one of it's + // inputs has to be a non-whole number + if (leftType & InputType.NUMBER_FRACT) return true; + if (rightType & InputType.NUMBER_FRACT) return true; + }; + const canBeFract = canBeFractional(); + + const canBePos = function () { + // POS * POS = POS + if ((leftType & InputType.NUMBER_POS) && (rightType & InputType.NUMBER_POS)) return true; + // NEG * NEG = POS + if ((leftType & InputType.NUMBER_NEG) && (rightType & InputType.NUMBER_NEG)) return true; + }; + if (canBePos()) { + resultType |= InputType.NUMBER_POS_INT | InputType.NUMBER_POS_INF; + if (canBeFract) resultType |= InputType.NUMBER_POS_FRACT; + } + + const canBeNeg = function () { + // POS * NEG = NEG + if ((leftType & InputType.NUMBER_POS) && (rightType & InputType.NUMBER_NEG)) return true; + // NEG * POS = NEG + if ((leftType & InputType.NUMBER_NEG) && (rightType & InputType.NUMBER_POS)) return true; + }; + if (canBeNeg()) { + resultType |= InputType.NUMBER_NEG_INT | InputType.NUMBER_NEG_INF; + if (canBeFract) resultType |= InputType.NUMBER_NEG_FRACT; } + + const canBeZero = function () { + // 0 * 0 = 0 + if ((leftType & InputType.NUMBER_ZERO) && (rightType & InputType.NUMBER_ZERO)) return true; + // -0 * -0 = 0 + if ((leftType & InputType.NUMBER_NEG_ZERO) && (rightType & InputType.NUMBER_NEG_ZERO)) return true; + // 0 * POS_REAL = 0 + if ((leftType & InputType.NUMBER_ZERO) && (rightType & InputType.NUMBER_POS_REAL)) return true; + // -0 * NEG_REAL = 0 + if ((leftType & InputType.NUMBER_NEG_ZERO) && (rightType & InputType.NUMBER_NEG_REAL)) return true; + // POS_REAL * 0 = 0 + if ((leftType & InputType.NUMBER_POS_REAL) && (rightType & InputType.NUMBER_ZERO)) return true; + // NEG_REAL * -0 = 0 + if ((leftType & InputType.NUMBER_NEG_REAL) && (rightType & InputType.NUMBER_NEG_ZERO)) return true; + // Rounding errors like 1e-323 * 0.1 = 0 + if ((leftType & InputType.NUMBER_FRACT) && (rightType & InputType.NUMBER_FRACT)) return true; + }; + if (canBeZero()) resultType |= InputType.NUMBER_ZERO; + + const canBeNegZero = function () { + // 0 * -0 = 0 + if ((leftType & InputType.NUMBER_ZERO) && (rightType & InputType.NUMBER_NEG_ZERO)) return true; + // -0 * 0 = 0 + if ((leftType & InputType.NUMBER_NEG_ZERO) && (rightType & InputType.NUMBER_ZERO)) return true; + // -0 * POS_REAL = -0 + if ((leftType & InputType.NUMBER_NEG_ZERO) && (rightType & InputType.NUMBER_POS_REAL)) return true; + // 0 * NEG_REAL = -0 + if ((leftType & InputType.NUMBER_ZERO) && (rightType & InputType.NUMBER_NEG_REAL)) return true; + // POS_REAL * -0 = -0 + if ((leftType & InputType.NUMBER_POS_REAL) && (rightType & InputType.NUMBER_NEG_ZERO)) return true; + // NEG_REAL * 0 = -0 + if ((leftType & InputType.NUMBER_NEG_REAL) && (rightType & InputType.NUMBER_ZERO)) return true; + // Rounding errors like -1e-323 / 10 = -0 + if ((leftType & InputType.NUMBER_NEG_REAL) && (rightType & InputType.NUMBER_POS_REAL)) return true; + // Rounding errors like 1e-323 / -10 = -0 + if ((leftType & InputType.NUMBER_POS_REAL) && (rightType & InputType.NUMBER_NEG_REAL)) return true; + }; + if (canBeNegZero()) resultType |= InputType.NUMBER_NEG_ZERO; + + return resultType; + } + + case InputOpcode.OP_DIVIDE: { + const leftType = inputs.left.type; + const rightType = inputs.right.type; + + let resultType = 0; + + const canBeNaN = function () { + // (-)0 / (-)0 = NaN + if ((leftType & InputType.NUMBER_ANY_ZERO) && (rightType & InputType.NUMBER_ANY_ZERO)) return true; + // (-)Infinity / (-)Infinity = NaN + if ((leftType & InputType.NUMBER_INF) && (rightType & InputType.NUMBER_INF)) return true; + // (-)0 / NaN = NaN + if ((leftType & InputType.NUMBER_ANY_ZERO) && (rightType & InputType.NUMBER_NAN)) return true; + }; + if (canBeNaN()) resultType |= InputType.NUMBER_NAN; + + const canBePos = function () { + // POS / POS = POS + if ((leftType & InputType.NUMBER_POS) && (rightType & InputType.NUMBER_POS)) return true; + // NEG / NEG = POS + if ((leftType & InputType.NUMBER_NEG) && (rightType & InputType.NUMBER_NEG)) return true; + }; + if (canBePos()) resultType |= InputType.NUMBER_POS; + + const canBeNegInfinity = function () { + // NEG / 0 = -Infinity + if ((leftType & InputType.NUMBER_NEG) && (rightType & InputType.NUMBER_ZERO)) return true; + // POS / -0 = -Infinity + if ((leftType & InputType.NUMBER_POS) && (rightType & InputType.NUMBER_NEG_ZERO)) return true; + // NEG_REAL / POS_REAL ~= -Infinity + if ((leftType & InputType.NUMBER_NEG_REAL) && (rightType & InputType.NUMBER_POS_REAL)) return true; + // POS_REAL / NEG_REAL ~= -Infinity + if ((leftType & InputType.NUMBER_POS_REAL) && (rightType & InputType.NUMBER_NEG_REAL)) return true; + }; + if (canBeNegInfinity()) resultType |= InputType.NUMBER_NEG_INF; + + const canBeInfinity = function () { + // POS / 0 = Infinity + if ((leftType & InputType.NUMBER_POS) && (rightType & InputType.NUMBER_ZERO)) return true; + // NEG / -0 = Infinity + if ((leftType & InputType.NUMBER_NEG) && (rightType & InputType.NUMBER_NEG_ZERO)) return true; + // POS_REAL / POS_REAL ~= Infinity + if ((leftType & InputType.NUMBER_POS_REAL) && (rightType & InputType.NUMBER_POS_REAL)) return true; + // NEG_REAL / NEG_REAL ~= Infinity + if ((leftType & InputType.NUMBER_NEG_REAL) && (rightType & InputType.NUMBER_NEG_REAL)) return true; + }; + if (canBeInfinity()) resultType |= InputType.NUMBER_POS_INF; + + const canBeNeg = function () { + // POS / NEG = NEG + if ((leftType & InputType.NUMBER_POS) && (rightType & InputType.NUMBER_NEG)) return true; + // NEG / POS = NEG + if ((leftType & InputType.NUMBER_NEG) && (rightType & InputType.NUMBER_POS)) return true; + }; + if (canBeNeg()) resultType |= InputType.NUMBER_NEG; + + const canBeZero = function () { + // 0 / POS = 0 + if ((leftType & InputType.NUMBER_ZERO) && (rightType & InputType.NUMBER_POS)) return true; + // -0 / NEG = 0 + if ((leftType & InputType.NUMBER_NEG_ZERO) && (rightType & InputType.NUMBER_NEG)) return true; + // Rounding errors like 1e-323 / 10 = 0 + if ((leftType & InputType.NUMBER_POS_REAL) && (rightType & InputType.NUMBER_POS_REAL)) return true; + // Rounding errors like -1e-323 / -10 = 0 + if ((leftType & InputType.NUMBER_NEG_REAL) && (rightType & InputType.NUMBER_NEG_REAL)) return true; + // NUMBER_POS / Infinity = 0 + if ((leftType & InputType.NUMBER_POS) && (rightType & InputType.NUMBER_POS_INF)) return true; + // NUMBER_NEG / -Infinity = 0 + if ((leftType & InputType.NUMBER_NEG) && (rightType & InputType.NUMBER_NEG_INF)) return true; + }; + if (canBeZero()) resultType |= InputType.NUMBER_ZERO; + + const canBeNegZero = function () { + // -0 / POS = -0 + if ((leftType & InputType.NUMBER_NEG_ZERO) && (rightType & InputType.NUMBER_POS)) return true; + // 0 / NEG = -0 + if ((leftType & InputType.NUMBER_ZERO) && (rightType & InputType.NUMBER_NEG)) return true; + // Rounding errors like -1e-323 / 10 = -0 + if ((leftType & InputType.NUMBER_NEG_REAL) && (rightType & InputType.NUMBER_POS_REAL)) return true; + // Rounding errors like 1e-323 / -10 = -0 + if ((leftType & InputType.NUMBER_POS_REAL) && (rightType & InputType.NUMBER_NEG_REAL)) return true; + // NUMBER_POS / -Infinity = -0 + if ((leftType & InputType.NUMBER_POS) && (rightType & InputType.NUMBER_NEG_INF)) return true; + // NUMBER_NEG / Infinity = -0 + if ((leftType & InputType.NUMBER_NEG) && (rightType & InputType.NUMBER_POS_INF)) return true; + }; + if (canBeNegZero()) resultType |= InputType.NUMBER_NEG_ZERO; + + return resultType; + } } - return /** @type {any} */ (out); + return inputBlock.type; } /** - * @param {any} value - * @returns {any} + * @param {IntermediateInput} inputBlock + * @param {TypeState} state + * @returns {boolean} * @private */ - _deepClone (value) { - if (!value || typeof value !== 'object') return value; - if (Array.isArray(value)) return value.map(v => this._deepClone(v)); - const out = {}; - for (const k of Object.keys(value)) { - out[k] = this._deepClone(value[k]); - } - return out; + analyzeInputBlock (inputBlock, state) { + const inputs = inputBlock.inputs; + + let modified = this.analyzeInputs(inputs, state); + const newType = this.getInputType(inputBlock, state); + + modified = modified || newType !== inputBlock.type; + inputBlock.type = newType; + + switch (inputBlock.opcode) { + case InputOpcode.ADDON_CALL: + modified = state.clear() || modified; + break; + case InputOpcode.RAW_SOURCE: + modified = this.analyzeInputs(inputs.fragments, state) || modified; + modified = state.clear() || modified; + break; + case InputOpcode.PROCEDURE_CALL: { + modified = this.analyzeInputs(inputs.inputs, state) || modified; + const script = this.ir.procedures[inputs.variant]; + + if (!script || !script.cachedAnalysisEndState) { + modified = state.clear() || modified; + } else if (script.yields) { + modified = state.overwrite(script.cachedAnalysisEndState) || modified; + } else { + modified = state.after(script.cachedAnalysisEndState) || modified; + } + break; + } + } + + return modified; } /** - * @param {node} node - * @param {string} variant - * @returns {boolean} - * @private + * @param {Object} inputs + * @param {TypeState} state + * @returns {boolean} modified */ - _containsProcedureVariant (node, variant) { - if (!node || typeof node !== 'object') return false; - if (node.kind === BLOCKS.PROCEDURES.CALL && node.variant === variant) return true; - if (Array.isArray(node)) return node.some(n => this._containsProcedureVariant(n, variant)); - for (const v of Object.values(node)) { - if (v && typeof v === 'object' && this._containsProcedureVariant(v, variant)) return true; - } - return false; + analyzeInputs (inputs, state) { + let modified = false; + for (const inputName in inputs) { + const input = inputs[inputName]; + if (input instanceof IntermediateInput) { + modified = this.analyzeInputBlock(input, state) || modified; + } + } + return modified; } /** - * @param {node} node - * @returns {boolean} - * @private + * @param {TypeState} state */ - _containsAnyCall (node) { - if (!node || typeof node !== 'object') return false; - if (node.kind === BLOCKS.PROCEDURES.CALL) return true; - if (node.kind === BLOCKS.ADDONS.CALL) return true; - if (Array.isArray(node)) return node.some(n => this._containsAnyCall(n)); - for (const v of Object.values(node)) { - if (v && typeof v === 'object' && this._containsAnyCall(v)) return true; - } - return false; + addPossibleExitState (state) { + if (this.exitState === null) { + this.exitState = state.clone(); + return; + } + + this.exitState.or(state); } /** - * Optimize an arithmetic node. - * @param {node} node The arithmetic node to optimize. + * @param {IntermediateStackBlock} stackBlock + * @param {TypeState} state + * @returns {boolean} * @private - * @returns {node} The optimized arithmetic node. */ - _optimizeArithmetic (node) { - const left = this.optimizeInput(node.left); - const right = this.optimizeInput(node.right); - node.left = left; - node.right = right; - if (left && right && left.kind === BLOCKS.CONSTANT && right.kind === BLOCKS.CONSTANT) { - const a = +left.value; - const b = +right.value; - if (Number.isFinite(a) && Number.isFinite(b)) { - switch (node.kind) { - case BLOCKS.OP.ADD: - return {kind: BLOCKS.CONSTANT, value: (a + b).toString()}; - case BLOCKS.OP.SUBTRACT: - return {kind: BLOCKS.CONSTANT, value: (a - b).toString()}; - case BLOCKS.OP.MULTIPLY: - return {kind: BLOCKS.CONSTANT, value: (a * b).toString()}; - case BLOCKS.OP.DIVIDE: - return {kind: BLOCKS.CONSTANT, value: (a / b).toString()}; - case BLOCKS.OP.MOD: - return {kind: BLOCKS.CONSTANT, value: (a % b).toString()}; - } + analyzeStackBlock (stackBlock, state) { + const inputs = stackBlock.inputs; + let modified = false; + + if (stackBlock.ignoreState) { + state = state.clone(); + } + + switch (stackBlock.opcode) { + case StackOpcode.VAR_SET: + modified = this.analyzeInputs(inputs, state) || modified; + modified = state.setVariableType(inputs.variable, inputs.value.type) || modified; + break; + case StackOpcode.CONTROL_WHILE: + case StackOpcode.CONTROL_FOR: + modified = this.analyzeInputs(inputs, state) || modified; + modified = this.analyzeLoopedStack(inputs.do, state, stackBlock, true) || modified; + break; + case StackOpcode.CONTROL_REPEAT: + modified = this.analyzeInputs(inputs, state) || modified; + modified = this.analyzeLoopedStack(inputs.do, state, stackBlock, false) || modified; + break; + case StackOpcode.CONTROL_IF_ELSE: { + modified = this.analyzeInputs(inputs, state) || modified; + const trueState = state.clone(); + modified = this.analyzeStack(inputs.whenTrue, trueState) || modified; + modified = this.analyzeStack(inputs.whenFalse, state) || modified; + modified = state.or(trueState) || modified; + break; + } + case StackOpcode.CONTROL_STOP_SCRIPT: { + modified = this.analyzeInputs(inputs, state) || modified; + this.addPossibleExitState(state); + break; + } + case StackOpcode.CONTROL_WAIT_UNTIL: { + modified = state.clear() || modified; + modified = this.analyzeInputs(inputs, state) || modified; + break; + } + case StackOpcode.PROCEDURE_CALL: { + modified = this.analyzeInputs(inputs, state) || modified; + modified = this.analyzeInputs(inputs.inputs, state) || modified; + const script = this.ir.procedures[inputs.variant]; + + if (!script || !script.cachedAnalysisEndState) { + modified = state.clear() || modified; + } else if (script.yields) { + modified = state.overwrite(script.cachedAnalysisEndState) || modified; + } else { + modified = state.after(script.cachedAnalysisEndState) || modified; + } + break; + } + case StackOpcode.COMPATIBILITY_LAYER: { + modified = this.analyzeInputs(inputs, state) || modified; + this.analyzeInputs(inputs.inputs, state); + for (const substackName in inputs.substacks) { + const newState = state.clone(); + modified = this.analyzeStack(inputs.substacks[substackName], newState) || modified; + modified = state.or(newState) || modified; } + break; + } + case StackOpcode.RAW_SOURCE: + modified = this.analyzeInputs(inputs.fragments, state) || modified; + modified = state.clear() || modified; + break; + default: + modified = this.analyzeInputs(inputs, state) || modified; + break; } - return node; + + return modified; } /** - * Optimize a join node. - * @param {node} node The join node to optimize. + * @param {IntermediateStack?} stack + * @param {TypeState} state + * @returns {boolean} * @private - * @returns {node} The optimized join node. */ - _optimizeJoin (node) { - const left = this.optimizeInput(node.left); - const right = this.optimizeInput(node.right); - node.left = left; - node.right = right; - if (left && right && left.kind === BLOCKS.CONSTANT && right.kind === BLOCKS.CONSTANT) { - const a = left.value; - const b = right.value; - if (a && b) { - return {kind: BLOCKS.CONSTANT, value: a + b}; + analyzeStack (stack, state) { + if (!stack) return false; + let modified = false; + for (const stackBlock of stack.blocks) { + let stateChanged = this.analyzeStackBlock(stackBlock, state); + + if (!stackBlock.ignoreState) { + if (stackBlock.yields && !this.ignoreYields) stateChanged = state.clear() || stateChanged; + + if (stateChanged) { + if (stackBlock.exitState) stackBlock.exitState.or(state); + else stackBlock.exitState = state.clone(); + modified = true; + } } } - return node; + return modified; } /** - * Optimize a length node. - * @param {node} node The length node to optimize. + * @param {IntermediateStack} stack + * @param {TypeState} state + * @param {IntermediateStackBlock} block + * @param {boolean} willReevaluateInputs + * @returns {boolean} * @private - * @returns {node} The optimized length node. */ - _optimizeLength (node) { - const s = this.optimizeInput(node.string); - node.string = s; - if (s && s.kind === BLOCKS.CONSTANT) { - return {kind: BLOCKS.CONSTANT, value: ((`${s.value}`).length).toString()}; - } - return node; + analyzeLoopedStack (stack, state, block, willReevaluateInputs) { + let modified = false; + + if (block.yields && !this.ignoreYields) { + modified = state.clear(); + if (willReevaluateInputs) { + modified = this.analyzeInputs(block.inputs, state) || modified; + } + block.entryState = state.clone(); + block.exitState = state.clone(); + return this.analyzeStack(stack, state) || modified; + } + + let iterations = 0; + let keepLooping; + do { + // If we are stuck in an apparent infinite loop, give up and assume the worst. + if (iterations > 10000) { + log.error('analyzeLoopedStack stuck in likely infinite loop; quitting', block, state); + modified = state.clear(); + block.entryState = state.clone(); + block.exitState = state.clone(); + modified = this.analyzeInputs(block.inputs, state) || modified; + return this.analyzeStack(stack, state) || modified; + } + iterations++; + + const newState = state.clone(); + modified = this.analyzeStack(stack, newState) || modified; + modified = (keepLooping = state.or(newState)) || modified; + + if (willReevaluateInputs) { + modified = this.analyzeInputs(block.inputs, state) || modified; + } + } while (keepLooping); + block.entryState = state.clone(); + return modified; } /** - * Optimize a not node. - * @param {node} node The not node to optimize. + * @param {IntermediateInput} input + * @param {TypeState} state + * @returns {IntermediateInput} * @private - * @returns {node} The optimized not node. */ - _optimizeNot (node) { - const input = this.optimizeInput(node.input); - node.input = input; - if (input && input.kind === BLOCKS.CONSTANT) { - const v = !!input.value; - return {kind: BLOCKS.CONSTANT, value: (!v).toString()}; - } - return node; - } + optimizeInput (input, state) { + for (const inputKey in input.inputs) { + const inputInput = input.inputs[inputKey]; + if (inputInput instanceof IntermediateInput) { + input.inputs[inputKey] = this.optimizeInput(inputInput, state); + } + } - _switchKeyOfCondition (cond) { - if (!cond) return null; - if (cond.kind === BLOCKS.OP.EQUALS) { - if (!cond.right || cond.right.kind !== BLOCKS.CONSTANT) return null; - return this._nodeKey(cond.left); + switch (input.opcode) { + case InputOpcode.CAST_BOOLEAN: { + const targetType = input.inputs.target.type; + if ((targetType & InputType.BOOLEAN) === targetType) { + return input.inputs.target; + } + return input; } - if (cond.kind === BLOCKS.OP.OR) { - return this._switchKeyOfCondition(cond.left); + + case InputOpcode.CAST_NUMBER: { + const targetType = input.inputs.target.type; + if ((targetType & InputType.NUMBER) === targetType) { + return input.inputs.target; + } + return input; } - return null; - } - _collectEqualsValues (cond, leftKey, out) { - if (!cond) return false; - if (cond.kind === BLOCKS.OP.EQUALS) { - if (this._nodeKey(cond.left) !== leftKey) return false; - if (!cond.right || cond.right.kind !== BLOCKS.CONSTANT) return false; - out.push(cond.right); - return true; + case InputOpcode.CAST_NUMBER_INDEX: { + const targetType = input.inputs.target.type; + if ((targetType & InputType.NUMBER_INDEX) === targetType) { + return input.inputs.target; + } + return input; } - if (cond.kind === BLOCKS.OP.OR) { - return this._collectEqualsValues(cond.left, leftKey, out) && - this._collectEqualsValues(cond.right, leftKey, out); + + case InputOpcode.CAST_NUMBER_OR_NAN: { + const targetType = input.inputs.target.type; + if ((targetType & InputType.NUMBER_OR_NAN) === targetType) { + return input.inputs.target; + } + return input; } - return false; + + case InputOpcode.CAST_STRING: { + const targetType = input.inputs.target.type; + if ((targetType & InputType.STRING) === targetType) { + return input.inputs.target; + } + return input; + } + } + + return input; } /** - * Try to convert an equals if chain into a switch. - * @param {node[]} nodes The nodes to convert. - * @param {number} startIndex The index to start converting from. + * @param {IntermediateStack?} stack + * @param {TypeState} state The state of the project before this stack is run. * @private - * @returns {object|null} The converted node, or null if the conversion failed. */ - _tryConvertEqualsIfChain (nodes, startIndex) { - const first = nodes[startIndex]; - if (!first || first.kind !== BLOCKS.CONTROL.IF) return null; - if (first.whenFalse && first.whenFalse.length) return null; - const leftKey = this._switchKeyOfCondition(first.condition); - if (leftKey === null) return null; - - const cases = []; - let i = startIndex; - while (i < nodes.length) { - const n = nodes[i]; - if (!n || n.kind !== BLOCKS.CONTROL.IF) break; - if (n.whenFalse && n.whenFalse.length) break; - const values = []; - if (!this._collectEqualsValues(n.condition, leftKey, values) || !values.length) break; - cases.push({values, body: this._optimizeSubstack(n.whenTrue)}); - i += 1; - } - if (cases.length < 2) return null; - - for (const cs of cases) { - const last = cs.body[cs.body.length - 1]; - if (last && - last.kind !== BLOCKS.CONTROL.BREAK && - last.kind !== BLOCKS.CONTROL.STOP_SCRIPT && - last.kind !== BLOCKS.PROCEDURES.RETURN) { - return null; - } - } - - let allNumbers = true; - for (const cs of cases) { - for (const v of cs.values) { - if (v.kind !== BLOCKS.CONSTANT || Number.isNaN(+v.value)) { - allNumbers = false; + optimizeStack (stack, state) { + if (!stack) return; + for (const stackBlock of stack.blocks) { + if (stackBlock.entryState) state = stackBlock.entryState; + for (const inputKey in stackBlock.inputs) { + const input = stackBlock.inputs[inputKey]; + if (input instanceof IntermediateInput) { + stackBlock.inputs[inputKey] = this.optimizeInput(input, state); + } else if (input instanceof IntermediateStack) { + this.optimizeStack(input, state); } } + if (stackBlock.exitState) { + state = stackBlock.exitState; + } } + } - const switchBody = []; - for (const cs of cases) { - for (let vi = 0; vi < cs.values.length; vi++) { - const cur = cs.values[vi]; - if (allNumbers) cur.value = +cur.value; - if (vi === cs.values.length - 1) { - switchBody.push({ - kind: BLOCKS.CONTROL.CASE, - value: cur, - do: cs.body, - useNumbers: allNumbers - }); - } else { - switchBody.push({ - kind: BLOCKS.CONTROL.CASE_FALLTHROUGH, - value: cur, - useNumbers: allNumbers - }); - } + /** + * @param {IntermediateScript} script + * @param {Set} alreadyOptimized + * @private + */ + optimizeScript (script, alreadyOptimized) { + if (script.isProcedure) { + if (alreadyOptimized.has(script.procedureCode)) { + return; } + alreadyOptimized.add(script.procedureCode); } - try { - const switchNode = { - kind: BLOCKS.CONTROL.SWITCH, - value: JSON.parse(leftKey), - do: switchBody, - useNumbers: allNumbers - }; - return { - converted: [switchNode], - count: cases.length - }; - } catch { - return { - converted: [], - count: 0 - }; + for (const procVariant of script.dependedProcedures) { + this.optimizeScript(this.ir.procedures[procVariant], alreadyOptimized); } + + this.exitState = null; + const exitState = new TypeState(); + this.analyzeStack(script.stack, exitState); + + this.addPossibleExitState(exitState); + script.cachedAnalysisEndState = this.exitState; + + this.optimizeStack(script.stack, new TypeState()); } + optimize () { + this.optimizeScript(this.ir.entry, new Set()); + } } + module.exports = { - IROptimizer + IROptimizer, + TypeState }; diff --git a/src/compiler/jsexecute.js b/src/compiler/jsexecute.js index 1398c16186e..c855692340f 100644 --- a/src/compiler/jsexecute.js +++ b/src/compiler/jsexecute.js @@ -1,5 +1,4 @@ // @ts-check - /** * @fileoverview Runtime for scripts generated by jsgen */ @@ -14,12 +13,12 @@ const globalState = { Cast: require('../util/cast'), log: require('../util/log'), blockUtility: require('./compat-block-utility'), - thread: null, - vm: null + /** @type{import("../engine/thread")?} */ + thread: null }; let baseRuntime = ''; -const runtimeFunctions = Object.create(null); +const runtimeFunctions = {}; /** * Determine whether the current tick is likely stuck. @@ -51,7 +50,7 @@ runtimeFunctions.startHats = `const startHats = (requestedHat, optMatchFields) = /** * Implements "thread waiting", where scripts are halted until all the scripts have finished executing. - * @param {Array<*>} threads The list of threads. + * @param {Array} threads The list of threads. */ runtimeFunctions.waitThreads = `const waitThreads = function*(threads) { const thread = globalState.thread; @@ -88,7 +87,7 @@ runtimeFunctions.waitThreads = `const waitThreads = function*(threads) { /** * waitPromise: Wait until a Promise resolves or rejects before continuing. - * @param {Promise} promise The promise to wait for. + * @param {Promise} promise The promise to wait for. * @returns {*} the value that the promise resolves to, otherwise undefined if the promise rejects */ @@ -122,6 +121,7 @@ const waitPromise = function*(promise) { returnValue = value; thread.status = 0; // STATUS_RUNNING }, error => { + thread.status = 0; // STATUS_RUNNING globalState.log.warn('Promise rejected in compiled script:', error); returnValue = '' + error; thread.status = 0; // STATUS_RUNNING @@ -199,6 +199,8 @@ const executeInCompatibilityLayer = function*(inputs, blockFunction, isWarp, use } } + // todo: do we have to do anything extra if status is STATUS_DONE? + return finish(returnValue); }`; @@ -221,6 +223,15 @@ runtimeFunctions.retire = `const retire = () => { thread.target.runtime.sequencer.retireThread(thread); }`; +/** + * Converts NaN to zero. Used to match Scratch's string-to-number. + * Unlike (x || 0), -0 stays as -0 and is not converted to 0. + * This function needs to be written such that it's very easy for browsers to inline it. + * @param {number} value A number. Might be NaN. + * @returns {number} A number. Never NaN. + */ +runtimeFunctions.toNotNaN = `const toNotNaN = value => Number.isNaN(value) ? 0 : value`; + /** * Scratch cast to boolean. * Similar to Cast.toBoolean() @@ -281,19 +292,7 @@ baseRuntime += `const compareEqualSlow = (v1, v2) => { if (Number.isNaN(n2) || (n2 === 0 && isNotActuallyZero(v2))) return ('' + v1).toLowerCase() === ('' + v2).toLowerCase(); return n1 === n2; }; -const compareEqual = (v1, v2) => (typeof v1 === 'number' && typeof v2 === 'number' && (v1 === v1) && (v2 === v2) || v1 === v2) ? v1 === v2 : compareEqualSlow(v1, v2);`; - -/** - * Convert a value to the number a switch generated from an `=` if-chain should compare against. - * Values that Scratch would not treat as numbers become NaN, which matches no case label -- the - * same outcome as compareEqual's string comparison against a numeric label. - * @param {*} v A value - * @returns {number} v as a number, or NaN - */ -runtimeFunctions.toSwitchNumber = `const toSwitchNumber = v => { - const n = +v; - return (n === 0 && isNotActuallyZero(v)) ? NaN : n; -};`; +const compareEqual = (v1, v2) => (typeof v1 === 'number' && typeof v2 === 'number' && !Number.isNaN(v1) && !Number.isNaN(v2) || v1 === v2) ? v1 === v2 : compareEqualSlow(v1, v2);`; /** * Determine if one value is greater than another. @@ -316,7 +315,7 @@ runtimeFunctions.compareGreaterThan = `const compareGreaterThanSlow = (v1, v2) = } return n1 > n2; }; -const compareGreaterThan = (v1, v2) => typeof v1 === 'number' && typeof v2 === 'number' && (v1 === v1) && (v2 === v2) ? v1 > v2 : compareGreaterThanSlow(v1, v2)`; +const compareGreaterThan = (v1, v2) => typeof v1 === 'number' && typeof v2 === 'number' && !Number.isNaN(v1) ? v1 > v2 : compareGreaterThanSlow(v1, v2)`; /** * Determine if one value is less than another. @@ -339,7 +338,7 @@ runtimeFunctions.compareLessThan = `const compareLessThanSlow = (v1, v2) => { } return n1 < n2; }; -const compareLessThan = (v1, v2) => typeof v1 === 'number' && typeof v2 === 'number' && (v1 === v1) && (v2 === v2) ? v1 < v2 : compareLessThanSlow(v1, v2)`; +const compareLessThan = (v1, v2) => typeof v1 === 'number' && typeof v2 === 'number' && !Number.isNaN(v2) ? v1 < v2 : compareLessThanSlow(v1, v2)`; /** * Generate a random integer. @@ -375,8 +374,7 @@ runtimeFunctions.timer = `const timer = () => { */ // Date.UTC(2000, 0, 1) === 946684800000 // Hardcoding it is marginally faster -runtimeFunctions.daysSince2000 = `const MS_PER_DAY = 24 * 60 * 60 * 1000; -daysSince2000 = () => (Date.now() - 946684800000) / MS_PER_DAY`; +runtimeFunctions.daysSince2000 = `const daysSince2000 = () => (Date.now() - 946684800000) / (24 * 60 * 60 * 1000)`; /** * Determine distance to a sprite or point. @@ -390,9 +388,8 @@ runtimeFunctions.distance = `const distance = menu => { let targetX = 0; let targetY = 0; if (menu === '_mouse_') { - const mouse = thread.target.runtime.ioDevices.mouse; - targetX = mouse.getScratchX(); - targetY = mouse.getScratchY(); + targetX = thread.target.runtime.ioDevices.mouse.getScratchX(); + targetY = thread.target.runtime.ioDevices.mouse.getScratchY(); } else { const distTarget = thread.target.runtime.getSpriteTargetByName(menu); if (!distTarget) return 10000; @@ -402,7 +399,7 @@ runtimeFunctions.distance = `const distance = menu => { const dx = thread.target.x - targetX; const dy = thread.target.y - targetY; - return Math.hypot(dx, dy); + return Math.sqrt((dx * dx) + (dy * dy)); }`; /** @@ -417,47 +414,37 @@ baseRuntime += `const listIndexSlow = (index, length) => { if (index === 'last') { return length - 1; } else if (index === 'random' || index === 'any') { - if (length > 0) return Math.floor(Math.random() * length); + if (length > 0) { + return (Math.random() * length) | 0; + } return -1; } index = (+index || 0) | 0; - if (index < 1 || index > length) return -1; + if (index < 1 || index > length) { + return -1; + } return index - 1; }; const listIndex = (index, length) => { - // Fast path for common number case - if (typeof index === 'number') { - index = index | 0; - if (index < 1 || index > length) return -1; - return index - 1; + if (typeof index !== 'number') { + return listIndexSlow(index, length); } - return listIndexSlow(index, length); + index = index | 0; + return index < 1 || index > length ? -1 : index - 1; };`; /** * Get a value from a list. - * @param {import('../engine/variable')} list The list + * @param {Array} list The list * @param {*} idx The 1-indexed index in the list. * @returns {*} The list item, otherwise empty string if it does not exist. */ runtimeFunctions.listGet = `const listGet = (list, idx) => { - const len = list.length; - if (typeof idx === 'number') { - idx = idx | 0; // fast int - if (idx < 1 || idx > len) return ''; - return list[idx - 1]; - } - if (idx === 'last') { - return len === 0 ? '' : list[len - 1]; - } - if (idx === 'random' || idx === 'any') { - if (len === 0) return ''; - return list[(Math.random() * len) | 0]; + const index = listIndex(idx, list.length); + if (index === -1) { + return ''; } - // Fallback slow path (string/other -> number coercion & bounds) - idx = (+idx || 0) | 0; - if (idx < 1 || idx > len) return ''; - return list[idx - 1]; + return list[index]; }`; /** @@ -467,27 +454,13 @@ runtimeFunctions.listGet = `const listGet = (list, idx) => { * @param {*} value The new value. */ runtimeFunctions.listReplace = `const listReplace = (list, idx, value) => { - const values = list.value; - let len = values.length; - let index; - if (typeof idx === 'number') { - idx = idx | 0; - if (idx < 1 || idx > len) return; // invalid - index = idx - 1; - } else if (idx === 'last') { - if (len === 0) return; - index = len - 1; - } else if (idx === 'random' || idx === 'any') { - if (len === 0) return; - index = (Math.random() * len) | 0; - } else { - idx = (+idx || 0) | 0; - if (idx < 1 || idx > len) return; - index = idx - 1; + const index = listIndex(idx, list.value.length); + if (index === -1) { + return; } - values[index] = value; + list.value[index] = value; list._monitorUpToDate = false; -};`; +}`; /** * Insert a value in a list. @@ -496,34 +469,13 @@ runtimeFunctions.listReplace = `const listReplace = (list, idx, value) => { * @param {*} value The value to insert. */ runtimeFunctions.listInsert = `const listInsert = (list, idx, value) => { - const values = list.value; - let len = values.length; - let index; - if (typeof idx === 'number') { - idx = idx | 0; - if (idx < 1 || idx > len + 1) return; // invalid - index = idx - 1; - } else if (idx === 'last') { - // Insert at end - index = len; - } else if (idx === 'random' || idx === 'any') { - // Insert at random position including end - index = len === 0 ? 0 : (Math.random() * (len + 1)) | 0; - } else { - idx = (+idx || 0) | 0; - if (idx < 1 || idx > len + 1) return; - index = idx - 1; - } - // Fast paths - if (index === 0) { - values.unshift(value); - } else if (index === len) { - values.push(value); - } else { - values.splice(index, 0, value); + const index = listIndex(idx, list.value.length + 1); + if (index === -1) { + return; } + list.value.splice(index, 0, value); list._monitorUpToDate = false; -};`; +}`; /** * Delete a value from a list. @@ -531,40 +483,17 @@ runtimeFunctions.listInsert = `const listInsert = (list, idx, value) => { * @param {*} idx The Scratch index in the list. */ runtimeFunctions.listDelete = `const listDelete = (list, idx) => { - const values = list.value; - let len = values.length; if (idx === 'all') { - if (len) { - list.value = []; - list._monitorUpToDate = false; - } + list.value = []; return; } - let index; - if (typeof idx === 'number') { - idx = idx | 0; - if (idx < 1 || idx > len) return; - index = idx - 1; - } else if (idx === 'last') { - if (!len) return; - index = len - 1; - } else if (idx === 'random' || idx === 'any') { - if (!len) return; - index = (Math.random() * len) | 0; - } else { - idx = (+idx || 0) | 0; - if (idx < 1 || idx > len) return; - index = idx - 1; - } - if (index === 0) { - values.shift(); - } else if (index === len - 1) { - values.pop(); - } else { - values.splice(index, 1); + const index = listIndex(idx, list.value.length); + if (index === -1) { + return; } + list.value.splice(index, 1); list._monitorUpToDate = false; -};`; +}`; /** * Return whether a list contains a value. @@ -573,22 +502,19 @@ runtimeFunctions.listDelete = `const listDelete = (list, idx) => { * @returns {boolean} True if the list contains the item */ runtimeFunctions.listContains = `const listContains = (list, item) => { - const caseSensitive = (globalState.vm && globalState.vm.runtime && globalState.vm.runtime.runtimeOptions && - globalState.vm.runtime.runtimeOptions.caseSensitiveLists) || false; - const values = list.value; - if (caseSensitive) { - return values.indexOf(item) !== -1; + if (globalState.thread.target.runtime.runtimeOptions.caseSensitiveLists) { + return list.value.indexOf(item) !== -1; + } + if (list.value.indexOf(item) !== -1) { + return true; } - // Non case-sensitive: attempt ultra-fast primitive checks first. - // Hoist length & avoid repeated property lookups. - for (let i = 0, len = values.length; i < len; i++) { - const cur = values[i]; - if (cur === item) return true; // exact equal (covers numbers & same ref) - // Fallback to Scratch semantics compare if types differ or strings with casing differences. - if (compareEqual(cur, item)) return true; + for (let i = 0; i < list.value.length; i++) { + if (compareEqual(list.value[i], item)) { + return true; + } } return false; -};`; +}`; /** * Find the 1-indexed index of an item in a list. @@ -597,20 +523,16 @@ runtimeFunctions.listContains = `const listContains = (list, item) => { * @returns {number} The 1-indexed index of the item in the list, otherwise 0 */ runtimeFunctions.listIndexOf = `const listIndexOf = (list, item) => { - const caseSensitive = (globalState.vm && globalState.vm.runtime && globalState.vm.runtime.runtimeOptions && - globalState.vm.runtime.runtimeOptions.caseSensitiveLists) || false; - const values = list.value; - if (caseSensitive) { - const index = values.indexOf(item) + 1; - return index > 0 ? index : 0; + if (globalState.thread.target.runtime.runtimeOptions.caseSensitiveLists) { + return list.value.indexOf(item) + 1; } - for (let i = 0, len = values.length; i < len; i++) { - const cur = values[i]; - if (cur === item) return i + 1; - if (compareEqual(cur, item)) return i + 1; + for (let i = 0; i < list.value.length; i++) { + if (compareEqual(list.value[i], item)) { + return i + 1; + } } return 0; -};`; +}`; /** * Get the stringified form of a list. @@ -627,7 +549,17 @@ runtimeFunctions.listContents = `const listContents = list => { } } return list.value.join(''); -};`; +}`; + +runtimeFunctions.repeatString = `const repeatString = (string, count) => { + count = Math.floor(count); + return count < 0 || !Number.isFinite(count) ? '' : string.repeat(count); +}`; + +runtimeFunctions.replaceString = `const replaceString = (substring, string, replacement) => string.replace( + new RegExp(substring.replace(/[.*+?^$()|[\\]{}\\\\]/g, '\\\\$&'), 'gi'), + replacement +)`; /** * Convert a color to an RGB list @@ -646,7 +578,7 @@ runtimeFunctions.mod = `const mod = (n, modulus) => { let result = n % modulus; if (result / modulus < 0) result += modulus; return result; -};`; +}`; /** * Implements Scratch tangent. @@ -654,16 +586,12 @@ runtimeFunctions.mod = `const mod = (n, modulus) => { * @returns {number} value of tangent or Infinity or -Infinity */ runtimeFunctions.tan = `const tan = (angle) => { - const mod = angle % 360; - // Special cases for improved precision and performance - if (mod === 90 || mod === -270) return Infinity; - if (mod === -90 || mod === 270) return -Infinity; - if (mod === 0 || mod === 180 || mod === -180) return 0; - - // Convert to radians and calculate tangent - const radians = (Math.PI * angle) / 180; - return Math.round(Math.tan(radians) * 1e10) / 1e10; -};`; + switch (angle % 360) { + case -270: case 90: return Infinity; + case -90: case 270: return -Infinity; + } + return Math.round(Math.tan((Math.PI * angle) / 180) * 1e10) / 1e10; +}`; /** * @param {function} callback The function to run @@ -673,7 +601,7 @@ runtimeFunctions.tan = `const tan = (angle) => { runtimeFunctions.yieldThenCall = `const yieldThenCall = function* (callback, ...args) { yield; return callback(...args); -};`; +}`; /** * @param {function} callback The generator function to run @@ -683,65 +611,17 @@ runtimeFunctions.yieldThenCall = `const yieldThenCall = function* (callback, ... runtimeFunctions.yieldThenCallGenerator = `const yieldThenCallGenerator = function* (callback, ...args) { yield; return yield* callback(...args); -};`; - -/** - * Converts NaN to zero. Used to match Scratch's string-to-number. - * Unlike (x || 0), -0 stays as -0 and is not converted to 0. - * This function needs to be written such that it's very easy for browsers to inline it. - - * @param {number} value A number. Might be NaN. - * @returns {number} A number. Never NaN. - */ -runtimeFunctions.toNotNaN = `const toNotNaN = value => Number.isNaN(value) ? 0 : value`; - -runtimeFunctions.parseJSON = `const parseJSON = value => { - if (value !== null && typeof value === "object") return value; - try { - return JSON.parse(value); - } catch { - return undefined; - } -}`; - -runtimeFunctions.toScratchString = `const toScratchString = value => { - if (value !== null && typeof value === "object") { - try { - return JSON.stringify(value); - } catch { - // Fall through to normal string conversion. - } - } - return "" + value; -}`; - -runtimeFunctions.toScratchValue = `const toScratchValue = value => { - if (value !== null && typeof value === "object") { - try { - return JSON.stringify(value); - } catch { - return "" + value; - } - } - return value ?? ""; }`; /** * Step a compiled thread. - * @param {*} thread The thread to step. + * @param {import("../engine/thread")} thread The thread to step. */ const execute = thread => { globalState.thread = thread; - // Make the VM available to runtime helper functions (some need runtime options). - // This avoids relying on a free variable like `vm` in generated helper code. - globalState.vm = thread.target && thread.target.runtime && thread.target.runtime.vm; thread.generator.next(); }; -/** - * Stack of threads to step. - * @type {Array<*>} - */ const threadStack = []; const saveGlobalState = () => { threadStack.push(globalState.thread); @@ -750,10 +630,6 @@ const restoreGlobalState = () => { globalState.thread = threadStack.pop(); }; -/** - * @param {string} source The source code to insert runtime functions into. - * @returns {string} The source code with runtime functions inserted. - */ const insertRuntime = source => { let result = baseRuntime; for (const functionName of Object.keys(runtimeFunctions)) { diff --git a/src/compiler/jsgen.js b/src/compiler/jsgen.js index 72cd5ae2520..129282ac6e1 100644 --- a/src/compiler/jsgen.js +++ b/src/compiler/jsgen.js @@ -1,35 +1,39 @@ -const Cast = require('../util/cast'); -const MathUtil = require('../util/math-util'); +// @ts-check + +const log = require('../util/log'); const BlockType = require('../extension-support/block-type'); const VariablePool = require('./variable-pool'); const jsexecute = require('./jsexecute'); const environment = require('./environment'); -const log = require('../util/log'); -const compiledExtensions = require('./extensions'); +const {StackOpcode, InputOpcode, InputType} = require('./enums.js'); +const oldCompilerCompatibility = require('./old-compiler-compatibility.js'); -const {TypedInput, VariableInput, ConstantInput, setCurrentGenerator} = require('./inputs'); +// These imports are used by jsdoc comments but eslint doesn't know that +/* eslint-disable no-unused-vars */ const { - sanitize, - isSafeConstantForEqualsOptimization, - getNamesOfCostumesAndSounds, - toNotNaN -} = require('./shared'); - -const {TYPES, BLOCKS, getNameForType} = require('./enums'); - - -// Imported for JSDoc types, not to actually use -// eslint-disable-next-line no-unused-vars -const {IntermediateScript, IntermediateRepresentation} = require('./intermediate'); -// eslint-disable-next-line no-unused-vars -const Variable = require('../engine/variable'); - -/* eslint-disable max-len */ + IntermediateStackBlock, + IntermediateInput, + IntermediateStack, + IntermediateScript, + IntermediateRepresentation +} = require('./intermediate'); +/* eslint-enable no-unused-vars */ /** * @fileoverview Convert intermediate representations to JavaScript functions. */ +/* eslint-disable max-len */ +/* eslint-disable prefer-template */ + +const sanitize = string => { + if (typeof string !== 'string') { + log.warn(`sanitize got unexpected type: ${typeof string}`); + string = '' + string; + } + return JSON.stringify(string).slice(1, -1); +}; + // Pen-related constants const PEN_EXT = 'runtime.ext_pen'; const PEN_STATE = `${PEN_EXT}._getPenState(target)`; @@ -49,22 +53,26 @@ const functionNameVariablePool = new VariablePool('fun'); */ const generatorNameVariablePool = new VariablePool('gen'); -/** - * @typedef {import("./input").Input} Input - */ - -// should inherit from object, only key thats garunteed is 'kind' -/** - * @typedef {{ kind: number, [key: string]: any }} node - */ +const isSafeInputForEqualsOptimization = (input, other) => { + // Only optimize constants + if (input.opcode !== InputOpcode.CONSTANT) return false; + // Only optimize when the constant can always be thought of as a number + if (input.isAlwaysType(InputType.NUMBER) || input.isAlwaysType(InputType.STRING_NUM)) { + if (other.isSometimesType(InputType.NUMBER_NAN | InputType.STRING_NAN | InputType.BOOLEAN_INTERPRETABLE)) { + // Never optimize 0 if the other input can be NaN, '' or a boolean. + // eg. if '< 0 = "" >' was optimized it would turn into `0 === +""`, + // which would be true even though Scratch would return false. + return (+input.inputs.value) !== 0; + } + return true; + } + return false; +}; /** * A frame contains some information about the current substack being compiled. */ class Frame { - /** - * @param {boolean} isLoop Whether this frame is a loop frame. - */ constructor (isLoop) { /** * Whether the current stack runs in a loop (while, for) @@ -78,49 +86,14 @@ class Frame { * @type {boolean} */ this.isLastBlock = false; - - /** - * Whether the current frame can be broken out of (switch/case blocks) - * @type {boolean} - */ - this.isBreakable = false; - - /** - * The variable name holding the switch value (for switch frames) - * @type {string?} - */ - this.switchValue = null; } } -// Cache for Math constants and functions -const MATH_CACHE = { - PI: 'const PI=Math.PI;', - DEG_TO_RAD: 'const DEG_TO_RAD=PI/180;', - RAD_TO_DEG: 'const RAD_TO_DEG=180/PI;', - sin: 'const sin=Math.sin;', - cos: 'const cos=Math.cos;', - asin: 'const asin=Math.asin;', - acos: 'const acos=Math.acos;', - atan: 'const atan=Math.atan;', - sqrt: 'const sqrt=Math.sqrt;', - abs: 'const abs=Math.abs;', - round: 'const round=Math.round;', - floor: 'const floor=Math.floor;', - ceil: 'const ceil=Math.ceil;', - exp: 'const exp=Math.exp;', - log: 'const log=Math.log;', - LN10: 'const LN10=Math.LN10;', - pow: 'const pow=Math.pow;', - max: 'const max=Math.max;', - min: 'const min=Math.min;' -}; - class JSGenerator { /** * @param {IntermediateScript} script * @param {IntermediateRepresentation} ir - * @param {Target} target + * @param {import("../sprites/rendered-target")} target */ constructor (script, ir, target) { this.script = script; @@ -128,11 +101,6 @@ class JSGenerator { this.target = target; this.source = ''; - /** - * @type {Object.} - */ - this.variableInputs = Object.create(null); - this.isWarp = script.isWarp; this.isProcedure = script.isProcedure; this.warpTimer = script.warpTimer; @@ -143,359 +111,22 @@ class JSGenerator { */ this.frames = []; - /** - * Type contexts for each stack frame. - * @type {Map[]} - */ - this.typeCtxs = []; - /** * The current Frame. * @type {Frame?} */ this.currentFrame = null; - this.namesOfCostumesAndSounds = getNamesOfCostumesAndSounds(target.runtime); - this.localVariables = new VariablePool('a'); this._setupVariablesPool = new VariablePool('b'); - this._setupVariables = Object.create(null); - this.usedMathFunctions = new Set(); - - // Procedure variants currently being inlined, to stop a recursive reporter from - // inlining itself forever. - this._inliningProcedures = new Set(); - - this.prependFunctions = new Map(); - - this._monitorUpdates = new Set(); + this._setupVariables = {}; this.descendedIntoModulo = false; this.isInHat = false; - /** - * When inlining a procedure call, STOP_SCRIPT inside the inlined body should exit only - * the inlined block (not the whole parent script). - * @type {string|null} - * @private - */ - this._inlineStopLabel = null; - - /** - * Stack of argument-name maps used while emitting an inlined procedure body. - * Each map translates a PROCEDURES.ARGUMENT index to a unique JS variable name. - * @type {Array>} - * @private - */ - this._inlinedProcedureArgNameMaps = []; - this.debug = this.target.runtime.debug; - this._cachedProperties = new Map(); - // Cache environment feature flags locally to avoid repeated global lookups. - this.supportsNullishCoalescing = environment.supportsNullishCoalescing; - - this.typeCtxs.push(new Map()); - } - - /** - * @param {any} node - * @param {number} kind - * @returns {boolean} - * @private - */ - _containsKind (node, kind) { - if (!node || typeof node !== 'object') return false; - if (node.kind === kind) return true; - if (Array.isArray(node)) return node.some(n => this._containsKind(n, kind)); - for (const v of Object.values(node)) { - if (v && typeof v === 'object' && this._containsKind(v, kind)) return true; - } - return false; - } - - _collectAssignedVariables (node, out) { - if (!node || typeof node !== 'object') return; - if (Array.isArray(node)) { - for (const n of node) this._collectAssignedVariables(n, out); - return; - } - if ((node.kind === BLOCKS.VAR.SET || node.kind === BLOCKS.CONTROL.FOR) && node.variable) { - out.set(node.variable.id, node.variable); - } - for (const v of Object.values(node)) { - if (v && typeof v === 'object') this._collectAssignedVariables(v, out); - } - } - - _clearTypesForVariables (variables) { - const sources = new Set(); - for (const variable of variables.values()) { - const scope = variable.scope === 'target' ? 'target' : 'stage'; - sources.add(`${scope}.variables["${sanitize(variable.id)}"]`); - } - for (const source of Object.keys(this._setupVariables)) { - if (sources.has(source)) { - this.clearVariableType(`${this._setupVariables[source]}.value`); - } - } - } - - _clearLoopAssignedTypes (body) { - const variables = new Map(); - this._collectAssignedVariables(body, variables); - this._clearTypesForVariables(variables); - } - - _scanProcWrites (node, writes, calls) { - if (!node || typeof node !== 'object') return; - if (Array.isArray(node)) { - for (const n of node) this._scanProcWrites(n, writes, calls); - return; - } - if ((node.kind === BLOCKS.VAR.SET || node.kind === BLOCKS.CONTROL.FOR) && node.variable) { - writes.set(node.variable.id, node.variable); - } else if (node.kind === BLOCKS.PROCEDURES.CALL && node.variant) { - calls.add(node.variant); - } - for (const v of Object.values(node)) { - if (v && typeof v === 'object') this._scanProcWrites(v, writes, calls); - } - } - - _ensureProcWriteSets () { - if (this._procWriteSets) return; - const procedures = this.ir.procedures; - const direct = new Map(); - for (const variant of Object.keys(procedures)) { - const writes = new Map(); - const calls = new Set(); - this._scanProcWrites(procedures[variant].stack, writes, calls); - direct.set(variant, {writes, calls}); - } - const result = new Map(); - for (const variant of direct.keys()) { - result.set(variant, new Map(direct.get(variant).writes)); - } - let changed = true; - while (changed) { - changed = false; - for (const [variant, {calls}] of direct) { - const set = result.get(variant); - for (const callee of calls) { - const calleeSet = result.get(callee); - if (!calleeSet) continue; - for (const [id, variable] of calleeSet) { - if (!set.has(id)) { - set.set(id, variable); - changed = true; - } - } - } - } - } - this._procWriteSets = result; - } - - _getProcedureWrittenVars (variant) { - this._ensureProcWriteSets(); - return this._procWriteSets.get(variant) || new Map(); - } - - _clearWrittenGlobals (writtenVars) { - this._clearTypesForVariables(writtenVars); - } - - /** - * @param {any} node - * @param {string} variant - * @returns {boolean} - * @private - */ - _containsProcedureVariantCall (node, variant) { - if (!node || typeof node !== 'object') return false; - if (node.kind === BLOCKS.PROCEDURES.CALL && node.variant === variant) return true; - if (Array.isArray(node)) return node.some(n => this._containsProcedureVariantCall(n, variant)); - for (const v of Object.values(node)) { - if (v && typeof v === 'object' && this._containsProcedureVariantCall(v, variant)) return true; - } - return false; - } - - /** - * Count how many IR nodes (objects with a numeric .kind) exist in a subtree. - * Stops early once the limit is reached. - * @param {any} node - * @param {number} limit - * @returns {number} - * @private - */ - _countKindedNodes (node, limit) { - let count = 0; - const visit = n => { - if (count >= limit) return; - if (!n || typeof n !== 'object') return; - if (Array.isArray(n)) { - for (const item of n) visit(item); - return; - } - if (typeof n.kind === 'number') { - count++; - if (count >= limit) return; - } - for (const v of Object.values(n)) { - if (v && typeof v === 'object') visit(v); - if (count >= limit) return; - } - }; - visit(node); - return count; - } - - /** - * Inline procedure calls when: - * - procedure and parent have the same warp mode - * - procedure does not use the compatibility layer or addon calls - * - procedure does not use PROCEDURES.RETURN - * - procedure does not (directly) call itself - * - inlining would not introduce yields into a non-generator parent - * @param {node} callNode - * @param {import('./intermediate').IntermediateScript} procedureData - * @returns {boolean} - * @private - */ - _canInlineProcedureCallInStack (/* callNode, procedureData */) { - return false; - /* - if (!procedureData || procedureData.stack === null) return false; - if (!Array.isArray(procedureData.stack)) return false; - if (procedureData.isWarp !== this.isWarp) return false; - - // avoid inlining yielding procedures; this tends to increase runtime overhead and - // produces very large generator bodies. - if (procedureData.yields) return false; - - // dont inline reporter-style/returning procedures. - if (this._containsKind(procedureData.stack, BLOCKS.PROCEDURES.RETURN)) return false; - - // avoid inlining procedures with loops/waits; these can be large and often run hot. - if (this._containsKind(procedureData.stack, BLOCKS.CONTROL.REPEAT)) return false; - if (this._containsKind(procedureData.stack, BLOCKS.CONTROL.REPEAT_UNTIL)) return false; - if (this._containsKind(procedureData.stack, BLOCKS.CONTROL.FOR)) return false; - if (this._containsKind(procedureData.stack, BLOCKS.CONTROL.WHILE)) return false; - if (this._containsKind(procedureData.stack, BLOCKS.CONTROL.WAIT)) return false; - if (this._containsKind(procedureData.stack, BLOCKS.CONTROL.WAIT_UNTIL)) return false; - - // avoid inlining very large procedures to prevent code bloat. - if (this._countKindedNodes(procedureData.stack, 41) >= 41) return false; - - // conservative: don't inline procedures that use the compat layer or addon calls. - if (this._containsKind(procedureData.stack, BLOCKS.COMPAT)) return false; - if (this._containsKind(procedureData.stack, BLOCKS.ADDONS.CALL)) return false; - - // don't inline procedures that call other procedures. - if (this._containsKind(procedureData.stack, BLOCKS.PROCEDURES.CALL)) return false; - - // avoid changing recursion/yield semantics. - if (callNode.variant && this._containsProcedureVariantCall(procedureData.stack, callNode.variant)) return false; - - return true; - */ - } - - /** - * @param {node} callNode - * @param {import('./intermediate').IntermediateScript} procedureData - * @private - */ - _emitInlinedProcedureCallInStack (callNode, procedureData) { - const hasArguments = callNode.arguments.length > 0; - const needsStopBoundary = this._containsKind(procedureData.stack, BLOCKS.CONTROL.STOP_SCRIPT); - - if (!hasArguments && !needsStopBoundary) { - this.source += '{\n'; - this.descendStack(procedureData.stack, new Frame(false)); - this.source += '}\n'; - return; - } - - const label = `proc_${this.localVariables.next()}`; - this.source += `${label}: {\n`; - - const argNameMap = new Map(); - - for (let i = 0; i < callNode.arguments.length; i++) { - const argJS = this.descendInput(callNode.arguments[i]).asSafe(); - const argName = `inl_${this.localVariables.next()}`; - argNameMap.set(i, argName); - this.source += `let ${argName} = ${argJS};\n`; - } - - const prevInlineStopLabel = this._inlineStopLabel; - this._inlineStopLabel = label; - - this._inlinedProcedureArgNameMaps.push(argNameMap); - this.descendStack(procedureData.stack, new Frame(false)); - this._inlinedProcedureArgNameMaps.pop(); - - this._inlineStopLabel = prevInlineStopLabel; - - this.source += '}\n'; - } - - getCurrentTypeCtx () { - return this.typeCtxs[this.typeCtxs.length - 1]; - } - /** - * @param {Array>} [ctxs] - * @returns {Array>} - */ - cloneTypeCtxs (ctxs = this.typeCtxs) { - return ctxs.map(ctx => new Map(ctx)); - } - - /** - * @param {Array>} ctxs - * @returns {Map} - */ - computeEffectiveTypeMap (ctxs) { - const effective = new Map(); - for (let i = ctxs.length - 1; i >= 0; i--) { - const ctx = ctxs[i]; - for (const [name, type] of ctx) { - if (!effective.has(name)) { - effective.set(name, type); - } - } - } - return effective; - } - - _pushMonitorUpdate (variableName) { - this._monitorUpdates.add(variableName); - } - - _flushMonitorUpdates () { - for (const variableName of this._monitorUpdates) { - this.source += `${variableName}._monitorUpToDate = false;\n`; - } - this._monitorUpdates.clear(); - } - - /** - * Forget the tracked type of a single variable across every enclosing scope. - * @param {string} name - */ - clearVariableType (name) { - for (const ctx of this.typeCtxs) { - ctx.delete(name); - } - } - - clearVariableTypes () { - for (const ctx of this.typeCtxs) { - ctx.clear(); - } + this.oldCompilerStub = new oldCompilerCompatibility.JSGeneratorStub(this); } /** @@ -504,7 +135,6 @@ class JSGenerator { */ pushFrame (frame) { this.frames.push(frame); - this.typeCtxs.push(new Map()); this.currentFrame = frame; } @@ -513,7 +143,6 @@ class JSGenerator { */ popFrame () { this.frames.pop(); - this.typeCtxs.pop(); this.currentFrame = this.frames[this.frames.length - 1]; } @@ -523,600 +152,281 @@ class JSGenerator { isLastBlockInLoop () { for (let i = this.frames.length - 1; i >= 0; i--) { const frame = this.frames[i]; - if (!frame.isLastBlock) return false; - if (frame.isLoop) return true; + if (!frame.isLastBlock) { + return false; + } + if (frame.isLoop) { + return true; + } } return false; } /** - * @param {node} node Input node to compile. - * @returns {Input} Compiled input. + * @param {IntermediateInput} block Input node to compile. + * @returns {string} Compiled input. */ - descendInput (node) { - switch (node.kind) { - case BLOCKS.ADDONS.CALL: - return new TypedInput(`(${this.descendAddonCall(node)})`, TYPES.UNKNOWN); - - case BLOCKS.COMPAT: + descendInput (block) { + const node = block.inputs; + switch (block.opcode) { + case InputOpcode.NOP: + return `""`; + + case InputOpcode.PROCEDURE_ARGUMENT: + return `p${node.index}`; + + case InputOpcode.ADDON_CALL: + return `(${this.descendAddonCall(node)})`; + + case InputOpcode.CAST_BOOLEAN: + return `toBoolean(${this.descendInput(node.target)})`; + case InputOpcode.CAST_NUMBER: + if (node.target.isAlwaysType(InputType.BOOLEAN_INTERPRETABLE)) { + return `(+${this.descendInput(node.target.toType(InputType.BOOLEAN))})`; + } + if (node.target.isAlwaysType(InputType.NUMBER_OR_NAN)) { + return `toNotNaN(${this.descendInput(node.target)})`; + } + return `toNotNaN(+${this.descendInput(node.target)})`; + case InputOpcode.CAST_NUMBER_OR_NAN: + return `(+${this.descendInput(node.target)})`; + case InputOpcode.CAST_NUMBER_INDEX: + return `(${this.descendInput(node.target.toType(InputType.NUMBER_OR_NAN))} | 0)`; + case InputOpcode.CAST_STRING: + return `("" + ${this.descendInput(node.target)})`; + case InputOpcode.CAST_COLOR: + return `colorToList(${this.descendInput(node.target)})`; + + case InputOpcode.COMPATIBILITY_LAYER: // Compatibility layer inputs never use flags. - return new TypedInput(`(${this.generateCompatibilityLayerCall(node, false)})`, TYPES.UNKNOWN); - - case BLOCKS.EXTENSION: - return this.generateCompiledExtensionCall(node); - - case BLOCKS.CONSTANT: - return this.safeConstantInput(node.value); - - case BLOCKS.COUNTER.GET: - return new TypedInput('runtime.ext_scratch3_control._counter', TYPES.NUMBER); - - case BLOCKS.KEYBOARD.PRESSED: - return new TypedInput(`runtime.ioDevices.keyboard.getKeyIsDown(${this.descendInput(node.key).asSafe()})`, TYPES.BOOLEAN); - - case BLOCKS.LIST.CONTAINS: - return new TypedInput(`listContains(${this.referenceVariable(node.list)}, ${this.descendInput(node.item).asUnknown()})`, TYPES.BOOLEAN); - case BLOCKS.LIST.CONTENTS: - return new TypedInput(`listContents(${this.referenceVariable(node.list)})`, TYPES.STRING); - case BLOCKS.LIST.GET: { - const index = this.descendInput(node.index); - const list = this.referenceVariable(node.list); - if (this.supportsNullishCoalescing) { - if (index.isAlwaysInt() && index.isAlwaysConstant()) { - return new TypedInput(`(${list}.value[${(+index.constantValue) - 1}] ?? "")`, TYPES.UNKNOWN); - } - if (index.isAlwaysNumberOrNaN()) { - return new TypedInput(`(${list}.value[${index.asInt()} - 1] ?? "")`, TYPES.UNKNOWN); - } - if (index.isConstant('last')) { - return new TypedInput(`(${list}.value[${list}.value.length - 1] ?? "")`, TYPES.UNKNOWN); - } - } - return new TypedInput(`listGet(${list}.value, ${index.asUnknown()})`, TYPES.UNKNOWN); - } - case BLOCKS.LIST.INDEXOF: - return new TypedInput(`listIndexOf(${this.referenceVariable(node.list)}, ${this.descendInput(node.item).asUnknown()})`, TYPES.NUMBER_INT); - case BLOCKS.LIST.LENGTH: - return new TypedInput(`${this.referenceVariable(node.list)}.value.length`, TYPES.NUMBER_INT); - case BLOCKS.LIST.AS: - if (node.format === 'JSON') { - return new TypedInput(`JSON.stringify(${this.referenceVariable(node.list)}.value)`, TYPES.STRING); - } else if (node.format === 'STRING') { - return new TypedInput(`(${this.referenceVariable(node.list)}.value.join(", "))`, TYPES.STRING); - } - break; - case BLOCKS.LOOKS.SIZE: - this.usedMathFunctions.add('round'); - return new TypedInput('round(target.size)', TYPES.NUMBER_INT); - case BLOCKS.LOOKS.BACKDROP_NAME: - return new TypedInput('stage.getCostumes()[stage.currentCostume].name', TYPES.STRING); - case BLOCKS.LOOKS.BACKDROP_NUMBER: - return new TypedInput('(stage.currentCostume + 1)', TYPES.NUMBER_INT); - case BLOCKS.LOOKS.COSTUME_NAME: - return new TypedInput('target.getCostumes()[target.currentCostume].name', TYPES.STRING); - case BLOCKS.LOOKS.COSTUME_NUMBER: - return new TypedInput('(target.currentCostume + 1)', TYPES.NUMBER_INT); - case BLOCKS.LOOKS.COSTUMES: - return new TypedInput('JSON.stringify(target.getCostumes().map(costume => costume.name))', TYPES.STRING); - - case BLOCKS.MOTION.DIRECTION: - return new TypedInput('target.direction', TYPES.NUMBER); - case BLOCKS.MOTION.X_POSITION: - return new TypedInput('limitPrecision(target.x)', TYPES.NUMBER); - case BLOCKS.MOTION.Y_POSITION: - return new TypedInput('limitPrecision(target.y)', TYPES.NUMBER); - - case BLOCKS.MOUSE.DOWN: - return new TypedInput('runtime.ioDevices.mouse.getIsDown()', TYPES.BOOLEAN); - case BLOCKS.MOUSE.X: - return new TypedInput('runtime.ioDevices.mouse.getScratchX()', TYPES.NUMBER_INT); - case BLOCKS.MOUSE.Y: - return new TypedInput('runtime.ioDevices.mouse.getScratchY()', TYPES.NUMBER_INT); - - case BLOCKS.NOOP: - return new TypedInput('""', TYPES.STRING); - - case BLOCKS.OP.ABS: { - const value = this.descendInput(node.value); - if (value.isAlwaysConstant()) { - return new ConstantInput(Math.abs(toNotNaN(+value.constantValue)), false); - } - this.usedMathFunctions.add('abs'); - return new TypedInput(`abs(${value.asNumber()})`, TYPES.NUMBER); - } - case BLOCKS.OP.ACOS: { - // Needs to be marked as NaN because Math.acos(1.0001) === NaN - const value = this.descendInput(node.value); - if (value.isAlwaysConstant()) { - const val = toNotNaN(+value.constantValue); - return new ConstantInput(Math.acos(val) * 180 / Math.PI, false); - } - this.usedMathFunctions.add('acos'); - this.usedMathFunctions.add('PI'); - return new TypedInput(`((acos(${value.asNumber()}) * 180) / PI)`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.ADD: { - // Needs to be marked as NaN because Infinity + -Infinity === NaN - const left = this.descendInput(node.left); - const right = this.descendInput(node.right); - if (left.isAlwaysConstant() && right.isAlwaysConstant()) { - const value = toNotNaN(+left.constantValue) + toNotNaN(+right.constantValue); - return new ConstantInput(value, false); - } - if (left.isAlwaysFinite() || right.isAlwaysFinite()) { - if (left.isAlwaysInt() && right.isAlwaysInt()) { - return new TypedInput(`(${left.asNumber()} + ${right.asNumber()})`, TYPES.NUMBER_INT); - } - return new TypedInput(`(${left.asNumber()} + ${right.asNumber()})`, TYPES.NUMBER); - } - return new TypedInput(`(${left.asNumber()} + ${right.asNumber()})`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.SUBTRACT: { - // Needs to be marked as NaN because Infinity - Infinity === NaN - const left = this.descendInput(node.left); - const right = this.descendInput(node.right); - if (left.isAlwaysConstant() && right.isAlwaysConstant()) { - const value = toNotNaN(+left.constantValue) - toNotNaN(+right.constantValue); - return new ConstantInput(value, false); - } - if (left.isAlwaysFinite() || right.isAlwaysFinite()) { - if (left.isAlwaysInt() && right.isAlwaysInt()) { - return new TypedInput(`(${left.asNumber()} - ${right.asNumber()})`, TYPES.NUMBER_INT); + return `(${this.generateCompatibilityLayerCall(node, false)})`; + + case InputOpcode.OLD_COMPILER_COMPATIBILITY_LAYER: + return this.oldCompilerStub.descendInputFromNewCompiler(block); + + case InputOpcode.EXTENSION: + return this.generateExtensionCompilerSource(node); + + case InputOpcode.RAW_SOURCE: { + // Parenthesized so casts and operators cannot rebind the spliced expression. + // ("" + a + 1) would concatenate; ("" + (a + 1)) adds first, like the old compiler. + const source = this.generateRawSource(node.fragments); + return source === '' ? source : `(${source})`; + } + + case InputOpcode.CONSTANT: + if (block.isAlwaysType(InputType.NUMBER)) { + if (typeof node.value !== 'number') throw new Error(`JS: '${block.type}' type constant had ${typeof node.value} type value. Expected number.`); + if (Object.is(node.value, -0)) return '-0'; + return node.value.toString(); + } else if (block.isAlwaysType(InputType.BOOLEAN)) { + if (typeof node.value !== 'boolean') throw new Error(`JS: '${block.type}' type constant had ${typeof node.value} type value. Expected boolean.`); + return node.value.toString(); + } else if (block.isAlwaysType(InputType.COLOR)) { + if (!Array.isArray(node.value)) throw new Error(`JS: '${block.type}' type constant was not an array.`); + if (node.value.length !== 3) throw new Error(`JS: '${block.type}' type constant had an array of length '${node.value.length}'. Expected 3.`); + for (let i = 0; i < 3; i++) { + if (typeof node.value[i] !== 'number') { + throw new Error(`JS: '${block.type}' type constant element ${i} had a value of type '${node.value[i]}'. Expected number.`); + } } - return new TypedInput(`(${left.asNumber()} - ${right.asNumber()})`, TYPES.NUMBER); - } - return new TypedInput(`(${left.asNumber()} - ${right.asNumber()})`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.MULTIPLY: { - // Needs to be marked as NaN because Infinity * 0 === NaN - const left = this.descendInput(node.left); - const right = this.descendInput(node.right); - if (left.isAlwaysConstant() && right.isAlwaysConstant()) { - const leftVal = toNotNaN(+left.constantValue); - const rightVal = toNotNaN(+right.constantValue); - const value = leftVal * rightVal; - return new ConstantInput(value, false); - } - // Only safe to treat as definitely non-NaN when both operands are finite. - // If either operand can be +/-Infinity, then multiplying by 0 can yield NaN. - if (left.isAlwaysFinite() && right.isAlwaysFinite()) { - return new TypedInput(`(${left.asNumber()} * ${right.asNumber()})`, TYPES.NUMBER); - } - return new TypedInput(`(${left.asNumber()} * ${right.asNumber()})`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.DIVIDE: { - const left = this.descendInput(node.left); - const right = this.descendInput(node.right); - const leftStr = left.asNumber(); - const rightStr = right.asNumber(); - if (left.isAlwaysConstant() && right.isAlwaysConstant()) { - const leftVal = toNotNaN(+left.constantValue); - const rightVal = toNotNaN(+right.constantValue); - return new ConstantInput(leftVal / rightVal, false); - } - if (right.isAlwaysConstant()) { - // Dividing by a finite nonzero constant can never yield NaN: asNumber() strips NaN - // from the left, and a finite or Infinite value divided by a finite nonzero number - // stays finite or Infinite. A zero or non-numeric divisor -- which asNumber() - // coerces to 0 -- can give 0/0 = NaN, so those must stay NUMBER_NAN. - const rightVal = +right.constantValue; - if (Number.isFinite(rightVal) && rightVal !== 0) { - return new TypedInput(`(${leftStr} / ${rightStr})`, TYPES.NUMBER); + return `[${node.value[0]},${node.value[1]},${node.value[2]}]`; + } else if (block.isSometimesType(InputType.STRING)) { + return `"${sanitize(node.value.toString())}"`; + } throw new Error(`JS: Unknown constant input type '${block.type}'.`); + + case InputOpcode.SENSING_KEY_DOWN: + return `runtime.ioDevices.keyboard.getKeyIsDown(${this.descendInput(node.key)})`; + + case InputOpcode.LIST_CONTAINS: + return `listContains(${this.referenceVariable(node.list)}, ${this.descendInput(node.item)})`; + case InputOpcode.LIST_CONTENTS: + return `listContents(${this.referenceVariable(node.list)})`; + case InputOpcode.LIST_GET: { + if (environment.supportsNullishCoalescing) { + if (node.index.isAlwaysType(InputType.NUMBER_INTERPRETABLE | InputType.NUMBER_NAN)) { + return `(${this.referenceVariable(node.list)}.value[${this.descendInput(node.index.toType(InputType.NUMBER_INDEX))} - 1] ?? "")`; } - } - return new TypedInput(`(${leftStr} / ${rightStr})`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.AND: { - const left = this.descendInput(node.left); - const right = this.descendInput(node.right); - if (left.isAlwaysConstant() && right.isAlwaysConstant()) { - const leftVal = left.constantValue; - const rightVal = right.constantValue; - return new ConstantInput(Cast.toBoolean(leftVal) && Cast.toBoolean(rightVal), false); - } - return new TypedInput(`(${left.asBoolean()} && ${right.asBoolean()})`, TYPES.BOOLEAN); - } - case BLOCKS.OP.ASIN: { - // Needs to be marked as NaN because Math.asin(1.0001) === NaN - const value = this.descendInput(node.value); - const numStr = value.asNumber(); - if (value.isAlwaysConstant()) { - const val = toNotNaN(+numStr); - return new ConstantInput(Math.asin(val) * 180 / Math.PI, false); - } - this.usedMathFunctions.add('asin'); - this.usedMathFunctions.add('PI'); - return new TypedInput(`((asin(${numStr}) * 180) / PI)`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.ATAN: { - const value = this.descendInput(node.value); - if (value.isAlwaysConstant()) { - const val = toNotNaN(+value.constantValue); - return new ConstantInput((Math.atan(val) * 180) / Math.PI, false); - } - this.usedMathFunctions.add('atan'); - this.usedMathFunctions.add('PI'); - return new TypedInput(`((atan(${value.asNumber()}) * 180) / PI)`, TYPES.NUMBER); - } - case BLOCKS.OP.CEILING: { - const inp = this.descendInput(node.value); - if (inp.isAlwaysConstant()) { - const val = +inp.constantValue; - return new ConstantInput(toNotNaN(Math.ceil(val)), false); - } - if (inp.isAlwaysInt()) { - return new TypedInput(`${inp.asInt()}`, TYPES.NUMBER_INT); - } - this.usedMathFunctions.add('ceil'); - return new TypedInput(`ceil(${inp.asNumber()})`, TYPES.NUMBER_INT); - } - case BLOCKS.OP.CHANGECASE: { - const string = this.descendInput(node.string); - const method = node.case === 'uppercase' ? 'toUpperCase' : 'toLowerCase'; - if (string.isAlwaysConstant()) { - return new ConstantInput(`${string.constantValue}`[method](), false); - } - return new TypedInput(`${string.asString()}.${method}()`, TYPES.STRING); - } - case BLOCKS.OP.CONTAINS: { - const string = this.descendInput(node.string); - const contains = this.descendInput(node.contains); - if (string.isAlwaysConstant() && contains.isAlwaysConstant()) { - const s = `${string.constantValue}`.toLowerCase(); - const c = `${contains.constantValue}`.toLowerCase(); - return new ConstantInput(s.indexOf(c) !== -1, false); - } - return new TypedInput(`(${string.asLowerString()}.indexOf(${contains.asLowerString()}) !== -1)`, TYPES.BOOLEAN); - } - case BLOCKS.OP.COS: { - const value = this.descendInput(node.value); - if (value.isAlwaysConstant()) { - const val = toNotNaN(+value.constantValue); - return new ConstantInput(Math.round(Math.cos((Math.PI * val) / 180) * 1e10) / 1e10, false); - } - this.usedMathFunctions.add('cos'); - this.usedMathFunctions.add('PI'); - this.usedMathFunctions.add('round'); - return new TypedInput(`(round(cos((PI * ${value.asNumber()}) / 180) * 1e10) / 1e10)`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.EQUALS: { - const left = this.descendInput(node.left); - const right = this.descendInput(node.right); - // When both operands are known to never be numbers, only use string comparison to avoid all number parsing. - if (left.isNeverNumber() || right.isNeverNumber()) { - const leftLower = left.asLowerString(); - const rightLower = right.asLowerString(); - if (left.isAlwaysConstant() && right.isAlwaysConstant()) { - const l = `${left.constantValue}`.toLowerCase(); - const r = `${right.constantValue}`.toLowerCase(); - return new ConstantInput(l === r, false); + if (node.index.isConstant('last')) { + return `(${this.referenceVariable(node.list)}.value[${this.referenceVariable(node.list)}.value.length - 1] ?? "")`; } - return new TypedInput(`(${leftLower} === ${rightLower})`, TYPES.BOOLEAN); } - // Only fold when the inputs themselves carry a constantValue. - // Some inputs (e.g. VariableInput) may be analyzable as constant but do not expose constantValue, - // and Scratch equality semantics are not the same as JS strict equality for mixed types. - if (left instanceof ConstantInput && right instanceof ConstantInput) { - const leftVal = left.constantValue; - const rightVal = right.constantValue; - return new ConstantInput(Cast.compare(leftVal, rightVal) === 0, false); + return `listGet(${this.referenceVariable(node.list)}.value, ${this.descendInput(node.index)})`; + } + case InputOpcode.LIST_INDEX_OF: + return `listIndexOf(${this.referenceVariable(node.list)}, ${this.descendInput(node.item)})`; + case InputOpcode.LIST_LENGTH: + return `${this.referenceVariable(node.list)}.value.length`; + case InputOpcode.LIST_AS: + return node.format.toUpperCase() === 'JSON' ? + `JSON.stringify(${this.referenceVariable(node.list)}.value)` : + `${this.referenceVariable(node.list)}.value.join(", ")`; + + case InputOpcode.LOOKS_SIZE_GET: + return 'Math.round(target.size)'; + case InputOpcode.LOOKS_BACKDROP_NAME: + return 'stage.getCostumes()[stage.currentCostume].name'; + case InputOpcode.LOOKS_BACKDROP_NUMBER: + return '(stage.currentCostume + 1)'; + case InputOpcode.LOOKS_COSTUME_NAME: + return 'target.getCostumes()[target.currentCostume].name'; + case InputOpcode.LOOKS_COSTUME_NUMBER: + return '(target.currentCostume + 1)'; + case InputOpcode.LOOKS_COSTUMES: + return 'JSON.stringify(target.getCostumes().map(costume => costume.name))'; + + case InputOpcode.MOTION_DIRECTION_GET: + return 'target.direction'; + case InputOpcode.MOTION_X_GET: + return 'limitPrecision(target.x)'; + case InputOpcode.MOTION_Y_GET: + return 'limitPrecision(target.y)'; + + case InputOpcode.SENSING_MOUSE_DOWN: + return 'runtime.ioDevices.mouse.getIsDown()'; + case InputOpcode.SENSING_MOUSE_X: + return 'runtime.ioDevices.mouse.getScratchX()'; + case InputOpcode.SENSING_MOUSE_Y: + return 'runtime.ioDevices.mouse.getScratchY()'; + + case InputOpcode.OP_ABS: + return `Math.abs(${this.descendInput(node.value)})`; + case InputOpcode.OP_ACOS: + return `((Math.acos(${this.descendInput(node.value)}) * 180) / Math.PI)`; + case InputOpcode.OP_ADD: + return `(${this.descendInput(node.left)} + ${this.descendInput(node.right)})`; + case InputOpcode.OP_AND: + return `(${this.descendInput(node.left)} && ${this.descendInput(node.right)})`; + case InputOpcode.OP_ASIN: + return `((Math.asin(${this.descendInput(node.value)}) * 180) / Math.PI)`; + case InputOpcode.OP_ATAN: + return `((Math.atan(${this.descendInput(node.value)}) * 180) / Math.PI)`; + case InputOpcode.OP_CEILING: + return `Math.ceil(${this.descendInput(node.value)})`; + case InputOpcode.OP_CONTAINS: + return `(${this.descendInput(node.string)}.toLowerCase().indexOf(${this.descendInput(node.contains)}.toLowerCase()) !== -1)`; + case InputOpcode.OP_COS: + return `(Math.round(Math.cos((Math.PI * ${this.descendInput(node.value)}) / 180) * 1e10) / 1e10)`; + case InputOpcode.OP_DIVIDE: + return `(${this.descendInput(node.left)} / ${this.descendInput(node.right)})`; + case InputOpcode.OP_EQUALS: { + const left = node.left; + const right = node.right; + + // When either operand is known to never be a number, only use string comparison to avoid all number parsing. + if (!left.isSometimesType(InputType.NUMBER_INTERPRETABLE) || !right.isSometimesType(InputType.NUMBER_INTERPRETABLE)) { + return `(${this.descendInput(left.toType(InputType.STRING))}.toLowerCase() === ${this.descendInput(right.toType(InputType.STRING))}.toLowerCase())`; } - const leftAlwaysNumber = left.isAlwaysNumber(); - const rightAlwaysNumber = right.isAlwaysNumber(); // When both operands are known to be numbers, we can use === - // In certain conditions, we can use === when one of the operands is known to be a safe number. - if (leftAlwaysNumber && left.isAlwaysConstant() && isSafeConstantForEqualsOptimization(left)) { - return new TypedInput(`(${left.asNumber()} === ${right.asNumber()})`, TYPES.BOOLEAN); + if (left.isAlwaysType(InputType.NUMBER_INTERPRETABLE) && right.isAlwaysType(InputType.NUMBER_INTERPRETABLE)) { + return `(${this.descendInput(left.toType(InputType.NUMBER))} === ${this.descendInput(right.toType(InputType.NUMBER))})`; } - if (rightAlwaysNumber && right.isAlwaysConstant() && isSafeConstantForEqualsOptimization(right)) { - return new TypedInput(`(${left.asNumber()} === ${right.asNumber()})`, TYPES.BOOLEAN); + // In certain conditions, we can use === when one of the operands is known to be a safe number. + if (isSafeInputForEqualsOptimization(left, right) || isSafeInputForEqualsOptimization(right, left)) { + return `(${this.descendInput(left.toType(InputType.NUMBER))} === ${this.descendInput(right.toType(InputType.NUMBER))})`; } // No compile-time optimizations possible - use fallback method. - return new TypedInput(`compareEqual(${left.asUnknown()}, ${right.asUnknown()})`, TYPES.BOOLEAN); - } - case BLOCKS.OP.EXP: { - const value = this.descendInput(node.value); - if (value.isAlwaysConstant()) { - const val = toNotNaN(+value.constantValue); - return new ConstantInput(Math.exp(val), false); - } - this.usedMathFunctions.add('exp'); - return new TypedInput(`exp(${value.asNumber()})`, TYPES.NUMBER); - } - case BLOCKS.OP.FLOOR: { - const inp = this.descendInput(node.value); - if (inp.isAlwaysConstant()) { - const value = +inp.constantValue; - return new ConstantInput(toNotNaN(Math.floor(value)), false); - } - if (inp.isAlwaysInt()) { - return new TypedInput(`${inp.asNumber()}`, TYPES.NUMBER_INT); - } - this.usedMathFunctions.add('floor'); - return new TypedInput(`floor(${inp.asNumber()})`, TYPES.NUMBER_INT); - } - case BLOCKS.OP.GREATER: { - const left = this.descendInput(node.left); - const right = this.descendInput(node.right); - - if (left.isAlwaysConstant() && right.isAlwaysConstant()) { - return new ConstantInput(Cast.compare(left.constantValue, right.constantValue) > 0, false); - } - if (left.isAlwaysFinite() && right.isAlwaysFinite()) { - return new TypedInput(`(${left.asNumber()} > ${right.asNumber()})`, TYPES.BOOLEAN); - } - if (left.isAlwaysNumber() && right.isAlwaysNumber()) { - return new TypedInput(`(${left.asNumber()} > ${right.asNumber()})`, TYPES.BOOLEAN); + return `compareEqual(${this.descendInput(left)}, ${this.descendInput(right)})`; + } + case InputOpcode.OP_POW_E: + return `Math.exp(${this.descendInput(node.value)})`; + case InputOpcode.OP_FLOOR: + return `Math.floor(${this.descendInput(node.value)})`; + case InputOpcode.OP_GREATER: { + const left = node.left; + const right = node.right; + // When the left operand is a number and the right operand is a number or NaN, we can use > + if (left.isAlwaysType(InputType.NUMBER_INTERPRETABLE) && right.isAlwaysType(InputType.NUMBER_INTERPRETABLE | InputType.NUMBER_NAN)) { + return `(${this.descendInput(left.toType(InputType.NUMBER))} > ${this.descendInput(right.toType(InputType.NUMBER_OR_NAN))})`; + } + // When the left operand is a number or NaN and the right operand is a number, we can negate <= + if (left.isAlwaysType(InputType.NUMBER_INTERPRETABLE | InputType.NUMBER_NAN) && right.isAlwaysType(InputType.NUMBER_INTERPRETABLE)) { + return `!(${this.descendInput(left.toType(InputType.NUMBER_OR_NAN))} <= ${this.descendInput(right.toType(InputType.NUMBER))})`; } // When either operand is known to never be a number, avoid all number parsing. - if (left.isNeverNumber() || right.isNeverNumber()) { - return new TypedInput(`(${left.asLowerString()} > ${right.asLowerString()})`, TYPES.BOOLEAN); + if (!left.isSometimesType(InputType.NUMBER_INTERPRETABLE) || !right.isSometimesType(InputType.NUMBER_INTERPRETABLE)) { + return `(${this.descendInput(left.toType(InputType.STRING))}.toLowerCase() > ${this.descendInput(right.toType(InputType.STRING))}.toLowerCase())`; } // No compile-time optimizations possible - use fallback method. - return new TypedInput(`compareGreaterThan(${left.asUnknown()}, ${right.asUnknown()})`, TYPES.BOOLEAN); - } - case BLOCKS.OP.INDEXOF: { - const substring = this.descendInput(node.substring); - const string = this.descendInput(node.string); - if (substring.isAlwaysConstant() && string.isAlwaysConstant()) { - return new ConstantInput( - `${string.constantValue}`.toLowerCase().indexOf(`${substring.constantValue}`.toLowerCase()) + 1, - false - ); - } - return new TypedInput(`(${string.asLowerString()}.indexOf(${substring.asLowerString()}) + 1)`, TYPES.NUMBER_WHOLE); - } - case BLOCKS.OP.JOIN: { - const left = this.descendInput(node.left); - const right = this.descendInput(node.right); - if (left.isAlwaysConstant() && right.isAlwaysConstant()) { - const leftVal = left.constantValue; - const rightVal = right.constantValue; - return new ConstantInput(`${leftVal}${rightVal}`, false); - } - return new TypedInput(`(${left.asString()} + ${right.asString()})`, TYPES.STRING); - } - case BLOCKS.OP.LENGTH: { - const value = this.descendInput(node.string); - if (value.isAlwaysConstant()) { - return new ConstantInput(`${value.constantValue}`.length, false); - } - return new TypedInput(`${value.asString()}.length`, TYPES.NUMBER_WHOLE); - } - case BLOCKS.OP.LESS: { - const left = this.descendInput(node.left); - const right = this.descendInput(node.right); - - if (left.isAlwaysConstant() && right.isAlwaysConstant()) { - return new ConstantInput(Cast.compare(left.constantValue, right.constantValue) < 0, false); - } - - if (left.isAlwaysFinite() && right.isAlwaysFinite()) { - return new TypedInput(`(${left.asNumber()} < ${right.asNumber()})`, TYPES.BOOLEAN); - } - if (left.isAlwaysNumber() && right.isAlwaysNumber()) { - return new TypedInput(`(${left.asNumber()} < ${right.asNumber()})`, TYPES.BOOLEAN); + return `compareGreaterThan(${this.descendInput(left)}, ${this.descendInput(right)})`; + } + case InputOpcode.OP_JOIN: + return `(${this.descendInput(node.left)} + ${this.descendInput(node.right)})`; + case InputOpcode.OP_LENGTH: + return `${this.descendInput(node.string)}.length`; + case InputOpcode.OP_LESS: { + const left = node.left; + const right = node.right; + // When the left operand is a number or NaN and the right operand is a number, we can use < + if (left.isAlwaysType(InputType.NUMBER_INTERPRETABLE | InputType.NUMBER_NAN) && right.isAlwaysType(InputType.NUMBER_INTERPRETABLE)) { + return `(${this.descendInput(left.toType(InputType.NUMBER_OR_NAN))} < ${this.descendInput(right.toType(InputType.NUMBER))})`; + } + // When the left operand is a number and the right operand is a number or NaN, we can negate >= + if (left.isAlwaysType(InputType.NUMBER_INTERPRETABLE) && right.isAlwaysType(InputType.NUMBER_INTERPRETABLE | InputType.NUMBER_NAN)) { + return `!(${this.descendInput(left.toType(InputType.NUMBER))} >= ${this.descendInput(right.toType(InputType.NUMBER_OR_NAN))})`; } // When either operand is known to never be a number, avoid all number parsing. - if (left.isNeverNumber() || right.isNeverNumber()) { - return new TypedInput(`(${left.asLowerString()} < ${right.asLowerString()})`, TYPES.BOOLEAN); + if (!left.isSometimesType(InputType.NUMBER_INTERPRETABLE) || !right.isSometimesType(InputType.NUMBER_INTERPRETABLE)) { + return `(${this.descendInput(left.toType(InputType.STRING))}.toLowerCase() < ${this.descendInput(right.toType(InputType.STRING))}.toLowerCase())`; } // No compile-time optimizations possible - use fallback method. - return new TypedInput(`compareLessThan(${left.asUnknown()}, ${right.asUnknown()})`, TYPES.BOOLEAN); - } - case BLOCKS.OP.LETTERSOF: { - const start = this.descendInput(node.start); - const end = this.descendInput(node.end); - const string = this.descendInput(node.string); - return new TypedInput(`${string.asString()}.substring(${start.asNumber()} - 1, ${end.asNumber()})`, TYPES.STRING); - } - case BLOCKS.OP.LETTEROF: { - const string = this.descendInput(node.string); - const letter = this.descendInput(node.letter); - const letterIsConstant = letter.isAlwaysConstant(); - let l = letter.asInt(); - if (letterIsConstant) { - l = (+l) - 1; - } else { - l = `${l} - 1`; - } - if (string.isAlwaysConstant() && letterIsConstant) { - // `letter of` preserves case (unlike `contains`); must match the runtime path - // and the interpreter, which index the string as-is. - const s = `${string.constantValue}`; - return new ConstantInput(s[l] || '', false); - } - return new TypedInput(`((${string.asString()})[${l}] || "")`, TYPES.STRING); - } - case BLOCKS.OP.LN: { - // Needs to be marked as NaN because Math.log(-1) == NaN - const value = this.descendInput(node.value); - if (value.isAlwaysConstant()) { - const val = toNotNaN(+value.constantValue); - return new ConstantInput(Math.log(val), false); - } - this.usedMathFunctions.add('log'); - return new TypedInput(`log(${value.asNumber()})`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.LOG: { - // Needs to be marked as NaN because Math.log(-1) == NaN - const value = this.descendInput(node.value); - if (value.isAlwaysConstant()) { - const val = toNotNaN(+value.constantValue); - return new ConstantInput(Math.log(val) / Math.LN10, false); - } - this.usedMathFunctions.add('log'); - this.usedMathFunctions.add('LN10'); - return new TypedInput(`(log(${value.asNumber()}) / LN10)`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.MOD: { + return `compareLessThan(${this.descendInput(left)}, ${this.descendInput(right)})`; + } + case InputOpcode.OP_LETTER_OF: + return `((${this.descendInput(node.string)})[${this.descendInput(node.letter)} - 1] || "")`; + case InputOpcode.OP_LETTERS_OF: + return `${this.descendInput(node.string)}.substring(${this.descendInput(node.start)} - 1, ${this.descendInput(node.end)})`; + case InputOpcode.OP_INDEX_OF: + return `(${this.descendInput(node.string)}.toLowerCase().indexOf(${this.descendInput(node.substring)}.toLowerCase()) + 1)`; + case InputOpcode.OP_CHANGE_CASE: + return `${this.descendInput(node.string)}.${node.upper ? 'toUpperCase' : 'toLowerCase'}()`; + case InputOpcode.OP_REPEAT: + return `repeatString(${this.descendInput(node.string)}, ${this.descendInput(node.count)})`; + case InputOpcode.OP_REPLACE: + return `replaceString(${this.descendInput(node.substring)}, ${this.descendInput(node.string)}, ${this.descendInput(node.replacement)})`; + case InputOpcode.OP_TRIM: + return `${this.descendInput(node.string)}.trim()`; + case InputOpcode.OP_LOG_E: + return `Math.log(${this.descendInput(node.value)})`; + case InputOpcode.OP_LOG_10: + return `(Math.log(${this.descendInput(node.value)}) / Math.LN10)`; + case InputOpcode.OP_MOD: this.descendedIntoModulo = true; - const left = this.descendInput(node.left); - const right = this.descendInput(node.right); - const leftStr = left.asNumber(); - const rightStr = right.asNumber(); - if (left.isAlwaysConstant() && right.isAlwaysConstant()) { - const mod = (n, modulus) => { - let result = n % modulus; - if (result / modulus < 0) result += modulus; - return result; - }; - const leftVal = toNotNaN(+leftStr); - const rightVal = toNotNaN(+rightStr); - return new ConstantInput(mod(leftVal, rightVal), false); - } - if (left.isAlwaysFinite() && right.isAlwaysConstant()) { - const rightVal = +right.constantValue; - if (Number.isFinite(rightVal) && rightVal !== 0) { - if (Number.isInteger(rightVal)) { - return new TypedInput(`mod(${leftStr}, ${rightStr})`, TYPES.NUMBER_INT); - } - return new TypedInput(`mod(${leftStr}, ${rightStr})`, TYPES.NUMBER); - } - } - // Needs to be marked as NaN because mod(0, 0) (and others) == NaN - return new TypedInput(`mod(${leftStr}, ${rightStr})`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.PI: - this.usedMathFunctions.add('PI'); - return new ConstantInput('(PI)', TYPES.NUMBER); - case BLOCKS.OP.NEWLINE: - return new ConstantInput('"\n"', TYPES.STRING); - case BLOCKS.OP.NOT: { - const operand = this.descendInput(node.operand); - if (operand.isAlwaysConstant()) { - return new ConstantInput(!operand.constantValue, false); - } - return new TypedInput(`!${operand.asBoolean()}`, TYPES.BOOLEAN); - } - case BLOCKS.OP.OR: { - const left = this.descendInput(node.left); - const right = this.descendInput(node.right); - if (left.isAlwaysConstant() && right.isAlwaysConstant()) { - const leftVal = left.constantValue; - const rightVal = right.constantValue; - return new ConstantInput(Cast.toBoolean(leftVal) || Cast.toBoolean(rightVal), false); - } - return new TypedInput(`(${left.asBoolean()} || ${right.asBoolean()})`, TYPES.BOOLEAN); - } - case BLOCKS.OP.RANDOM: { - const left = this.descendInput(node.low); - const right = this.descendInput(node.high); - if (left.isAlwaysInt() && right.isAlwaysInt()) { - // Both inputs are ints, so we know neither are NaN - return new TypedInput(`randomInt(${left.asNumber()}, ${right.asNumber()})`, TYPES.NUMBER_INT); + return `mod(${this.descendInput(node.left)}, ${this.descendInput(node.right)})`; + case InputOpcode.OP_MULTIPLY: + return `(${this.descendInput(node.left)} * ${this.descendInput(node.right)})`; + case InputOpcode.OP_NOT: + return `!${this.descendInput(node.operand)}`; + case InputOpcode.OP_OR: + return `(${this.descendInput(node.left)} || ${this.descendInput(node.right)})`; + case InputOpcode.OP_RANDOM: + if (node.useInts) { + return `randomInt(${this.descendInput(node.low)}, ${this.descendInput(node.high)})`; } if (node.useFloats) { - return new TypedInput(`randomFloat(${left.asNumber()}, ${right.asNumber()})`, TYPES.NUMBER_NAN); - } - return new TypedInput(`runtime.ext_scratch3_operators._random(${left.asUnknown()}, ${right.asUnknown()})`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.REPEAT: { - const string = this.descendInput(node.string); - const count = this.descendInput(node.count); - this.prependFunctions.set('repeatString', `const repeatString = (string, count) => { - count = Math.floor(toNotNaN(+count)); - return count < 0 || !Number.isFinite(count) ? "" : ("" + string).repeat(count); - }`); - return new TypedInput(`repeatString(${string.asUnknown()}, ${count.asUnknown()})`, TYPES.STRING); - } - case BLOCKS.OP.REPLACE: { - const substring = this.descendInput(node.substring); - const string = this.descendInput(node.string); - const replacement = this.descendInput(node.replacement); - this.prependFunctions.set('replaceString', `const replaceString = (substring, string, replacement) => - ("" + string).replace( - new RegExp(("" + substring).replace(/[.*+?^$()|[\\]{}\\\\]/g, "\\\\$&"), "gi"), - "" + replacement - )`); - return new TypedInput( - `replaceString(${substring.asUnknown()}, ${string.asUnknown()}, ${replacement.asUnknown()})`, - TYPES.STRING - ); - } - case BLOCKS.OP.ROUND: { - const inp = this.descendInput(node.value); - if (inp.isAlwaysConstant()) { - const value = +inp.constantValue; - return new ConstantInput(toNotNaN(Math.round(value)), false); - } - if (inp.isAlwaysInt()) { - return new TypedInput(`${inp.asNumber()}`, TYPES.NUMBER_INT); - } - this.usedMathFunctions.add('round'); - return new TypedInput(`round(${inp.asNumber()})`, TYPES.NUMBER_INT); - } - case BLOCKS.OP.SIN: { - const value = this.descendInput(node.value); - if (value.isAlwaysConstant()) { - const val = toNotNaN(+value.constantValue); - return new ConstantInput((Math.round(Math.sin((Math.PI * val) / 180) * 1e10) / 1e10), false); - } - this.usedMathFunctions.add('sin'); - this.usedMathFunctions.add('PI'); - this.usedMathFunctions.add('round'); - return new TypedInput(`(round(sin((PI * ${value.asNumber()}) / 180) * 1e10) / 1e10)`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.SQRT: { - // Needs to be marked as NaN because Math.sqrt(-1) === NaN - const value = this.descendInput(node.value); - const numStr = value.asNumber(); - if (value.isAlwaysConstant()) { - const val = toNotNaN(+numStr); - return new ConstantInput(Math.sqrt(val), false); - } - this.usedMathFunctions.add('sqrt'); - return new TypedInput(`sqrt(${numStr})`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.TAN: { - const value = this.descendInput(node.value); - if (value.isAlwaysConstant()) { - const val = toNotNaN(+value.constantValue); - return new ConstantInput(MathUtil.tan(val), false); - } - // tan() comes from runtimeFunctions; it works in degrees, unlike Math.tan. - return new TypedInput(`tan(${value.asNumber()})`, TYPES.NUMBER_NAN); - } - case BLOCKS.OP.TENEXP: { - const value = this.descendInput(node.value); - if (value.isAlwaysConstant()) { - const val = toNotNaN(+value.constantValue); - return new ConstantInput(Math.pow(10, val), false); - } - return new TypedInput(`(10 ** ${value.asNumber()})`, TYPES.NUMBER); - } - case BLOCKS.OP.TRIM: { - const string = this.descendInput(node.string); - if (string.isAlwaysConstant()) { - return new ConstantInput(`${string.constantValue}`.trim(), false); - } - return new TypedInput(`${string.asString()}.trim()`, TYPES.STRING); - } - - case BLOCKS.PROCEDURES.CALL: { + return `randomFloat(${this.descendInput(node.low)}, ${this.descendInput(node.high)})`; + } + return `runtime.ext_scratch3_operators._random(${this.descendInput(node.low)}, ${this.descendInput(node.high)})`; + case InputOpcode.OP_ROUND: + return `Math.round(${this.descendInput(node.value)})`; + case InputOpcode.OP_SIN: + return `(Math.round(Math.sin((Math.PI * ${this.descendInput(node.value)}) / 180) * 1e10) / 1e10)`; + case InputOpcode.OP_SQRT: + return `Math.sqrt(${this.descendInput(node.value)})`; + case InputOpcode.OP_SUBTRACT: + return `(${this.descendInput(node.left)} - ${this.descendInput(node.right)})`; + case InputOpcode.OP_TAN: + return `tan(${this.descendInput(node.value)})`; + case InputOpcode.OP_POW_10: + return `(10 ** ${this.descendInput(node.value)})`; + + case InputOpcode.PROCEDURE_CALL: { const procedureCode = node.code; const procedureVariant = node.variant; const procedureData = this.ir.procedures[procedureVariant]; - const stack = procedureData.stack; - if (stack === null || stack.length === 0) { - // Procedure has no body; still evaluate arguments for side effects - const args = []; - for (const input of node.arguments) { - args.push(this.descendInput(input).asSafe()); - } - if (args.length) { - return new TypedInput(`(${args.join(',')}, "")`, TYPES.STRING); - } - return new TypedInput('""', TYPES.STRING); - } - - if (node.arguments.length === 0 && !this._inliningProcedures.has(procedureVariant)) { - if (stack[0].kind === BLOCKS.PROCEDURES.RETURN) { - this._inliningProcedures.add(procedureVariant); - const input = this.descendInput(stack[0].value); - this._inliningProcedures.delete(procedureVariant); - return input; - } + if (procedureData.stack === null) { + // TODO still need to evaluate arguments for side effects + return '""'; } // Recursion makes this complicated because: @@ -1126,7 +436,7 @@ class JSGenerator { const procedureReference = `thread.procedures["${sanitize(procedureVariant)}"]`; const args = []; for (const input of node.arguments) { - args.push(this.descendInput(input).asSafe()); + args.push(this.descendInput(input)); } const joinedArgs = args.join(','); @@ -1134,118 +444,112 @@ class JSGenerator { const yieldForHat = this.isInHat; if (yieldForRecursion || yieldForHat) { const runtimeFunction = procedureData.yields ? 'yieldThenCallGenerator' : 'yieldThenCall'; - return new TypedInput(`(yield* ${runtimeFunction}(${procedureReference}, ${joinedArgs}))`, TYPES.UNKNOWN); + return `(yield* ${runtimeFunction}(${procedureReference}, ${joinedArgs}))`; } if (procedureData.yields) { - return new TypedInput(`(yield* ${procedureReference}(${joinedArgs}))`, TYPES.UNKNOWN); - } - return new TypedInput(`${procedureReference}(${joinedArgs})`, TYPES.UNKNOWN); - } - case BLOCKS.PROCEDURES.ARGUMENT: - if (this._inlinedProcedureArgNameMaps.length) { - const currentMap = this._inlinedProcedureArgNameMaps[this._inlinedProcedureArgNameMaps.length - 1]; - const mappedName = currentMap.get(node.index); - if (mappedName) { - return new TypedInput(mappedName, TYPES.UNKNOWN); - } - } - return new TypedInput(`p${node.index}`, TYPES.UNKNOWN); - case BLOCKS.SENSING.ANSWER: - return new TypedInput(`runtime.ext_scratch3_sensing._answer`, TYPES.STRING); - case BLOCKS.SENSING.COLOR_TOUCHING_COLOR: - return new TypedInput(`target.colorIsTouchingColor(colorToList(${this.descendInput(node.target).asColor()}), colorToList(${this.descendInput(node.mask).asColor()}))`, TYPES.BOOLEAN); - case BLOCKS.SENSING.DATE: - return new TypedInput(`(new Date().getDate())`, TYPES.NUMBER_INT); - case BLOCKS.SENSING.DAYOFWEEK: - return new TypedInput(`(new Date().getDay() + 1)`, TYPES.NUMBER_INT); - case BLOCKS.SENSING.DAYS_SINCE_2000: - return new TypedInput('daysSince2000()', TYPES.NUMBER); - case BLOCKS.SENSING.DISTANCE: - return new TypedInput(`distance(${this.descendInput(node.target).asString()})`, TYPES.NUMBER); - case BLOCKS.SENSING.HOUR: - return new TypedInput(`(new Date().getHours())`, TYPES.NUMBER_INT); - case BLOCKS.SENSING.MINUTE: - return new TypedInput(`(new Date().getMinutes())`, TYPES.NUMBER_INT); - case BLOCKS.SENSING.MONTH: - return new TypedInput(`(new Date().getMonth() + 1)`, TYPES.NUMBER_INT); - case BLOCKS.SENSING.OF: { - const object = this.descendInput(node.object).asString(); - const property = node.property; - if (node.object.kind === BLOCKS.CONSTANT) { - const isStage = node.object.value === '_stage_'; - // Note that if target isn't a stage, we can't assume it exists - const objectReference = isStage ? 'stage' : this.evaluateOnce(`runtime.getSpriteTargetByName(${object})`); - if (property === 'volume') { - return new TypedInput(`(${objectReference} ? ${objectReference}.volume : 0)`, TYPES.NUMBER); - } - if (isStage) { - switch (property) { - case 'background #': - // fallthrough for scratch 1.0 compatibility - case 'backdrop #': - return new TypedInput(`(${objectReference}.currentCostume + 1)`, TYPES.NUMBER_INT); - case 'backdrop name': - return new TypedInput(`${objectReference}.getCostumes()[${objectReference}.currentCostume].name`, TYPES.STRING); - } - } else { - switch (property) { - case 'x position': - return new TypedInput(`(${objectReference} ? ${objectReference}.x : 0)`, TYPES.NUMBER); - case 'y position': - return new TypedInput(`(${objectReference} ? ${objectReference}.y : 0)`, TYPES.NUMBER); - case 'direction': - return new TypedInput(`(${objectReference} ? ${objectReference}.direction : 0)`, TYPES.NUMBER); - case 'costume #': - return new TypedInput(`(${objectReference} ? ${objectReference}.currentCostume + 1 : 0)`, TYPES.NUMBER_INT); - case 'costume name': - return new TypedInput(`(${objectReference} ? ${objectReference}.getCostumes()[${objectReference}.currentCostume].name : 0)`, TYPES.UNKNOWN); - case 'size': - return new TypedInput(`(${objectReference} ? ${objectReference}.size : 0)`, TYPES.NUMBER); - } - } - const variableReference = this.evaluateOnce(`${objectReference} && ${objectReference}.lookupVariableByNameAndType("${sanitize(property)}", "", true)`); - return new TypedInput(`(${variableReference} ? ${variableReference}.value : 0)`, TYPES.UNKNOWN); - } - return new TypedInput(`runtime.ext_scratch3_sensing.getAttributeOf({OBJECT: ${object}, PROPERTY: "${sanitize(property)}" })`, TYPES.UNKNOWN); - } - case BLOCKS.SENSING.SECOND: - return new TypedInput(`(new Date().getSeconds())`, TYPES.NUMBER_INT); - case BLOCKS.SENSING.REFRESH_TIME: - return new TypedInput('(runtime.screenRefreshTime / 1000)', TYPES.NUMBER); - case BLOCKS.SENSING.TOUCHING: - return new TypedInput(`target.isTouchingObject(${this.descendInput(node.object).asUnknown()})`, TYPES.BOOLEAN); - case BLOCKS.SENSING.TOUCHING_COLOR: - return new TypedInput(`target.isTouchingColor(colorToList(${this.descendInput(node.color).asColor()}))`, TYPES.BOOLEAN); - case BLOCKS.SENSING.ONLINE: - return new TypedInput('(typeof navigator.onLine === "boolean" ? navigator.onLine : "")', TYPES.BOOLEAN); - case BLOCKS.SENSING.USERNAME: - return new TypedInput('runtime.ioDevices.userData.getUsername()', TYPES.STRING); - case BLOCKS.SENSING.YEAR: - return new TypedInput(`(new Date().getFullYear())`, TYPES.NUMBER_INT); - - case BLOCKS.TIMER.GET: - return new TypedInput('runtime.ioDevices.clock.projectTimer()', TYPES.NUMBER); - - case BLOCKS.TW.LAST_KEY_PRESSED: - return new TypedInput('runtime.ioDevices.keyboard.getLastKeyPressed()', TYPES.STRING); - - case BLOCKS.VAR.GET: - return this.descendVariable(node.variable); + return `(yield* ${procedureReference}(${joinedArgs}))`; + } + return `${procedureReference}(${joinedArgs})`; + } + case InputOpcode.SENSING_ANSWER: + return `runtime.ext_scratch3_sensing._answer`; + case InputOpcode.SENSING_COLOR_TOUCHING_COLOR: + return `target.colorIsTouchingColor(${this.descendInput(node.target)}, ${this.descendInput(node.mask)})`; + case InputOpcode.SENSING_TIME_DATE: + return `(new Date().getDate())`; + case InputOpcode.SENSING_TIME_WEEKDAY: + return `(new Date().getDay() + 1)`; + case InputOpcode.SENSING_TIME_DAYS_SINCE_2000: + return 'daysSince2000()'; + case InputOpcode.SENSING_DISTANCE: + // TODO: on stages, this can be computed at compile time + return `distance(${this.descendInput(node.target)})`; + case InputOpcode.SENSING_TIME_HOUR: + return `(new Date().getHours())`; + case InputOpcode.SENSING_TIME_MINUTE: + return `(new Date().getMinutes())`; + case InputOpcode.SENSING_TIME_MONTH: + return `(new Date().getMonth() + 1)`; + case InputOpcode.SENSING_OF: + return `runtime.ext_scratch3_sensing.getAttributeOf({OBJECT: ${this.descendInput(node.object)}, PROPERTY: "${sanitize(node.property)}" })`; + case InputOpcode.SENSING_OF_VOLUME: { + const targetRef = this.descendTargetReference(node.object); + return `(${targetRef} ? ${targetRef}.volume : 0)`; + } case InputOpcode.SENSING_OF_BACKDROP_NUMBER: + return `(stage.currentCostume + 1)`; + case InputOpcode.SENSING_OF_BACKDROP_NAME: + return `stage.getCostumes()[stage.currentCostume].name`; + case InputOpcode.SENSING_OF_POS_X: { + const targetRef = this.descendTargetReference(node.object); + return `(${targetRef} ? ${targetRef}.x : 0)`; + } case InputOpcode.SENSING_OF_POS_Y: { + const targetRef = this.descendTargetReference(node.object); + return `(${targetRef} ? ${targetRef}.y : 0)`; + } case InputOpcode.SENSING_OF_DIRECTION: { + const targetRef = this.descendTargetReference(node.object); + return `(${targetRef} ? ${targetRef}.direction : 0)`; + } case InputOpcode.SENSING_OF_COSTUME_NUMBER: { + const targetRef = this.descendTargetReference(node.object); + return `(${targetRef} ? ${targetRef}.currentCostume + 1 : 0)`; + } case InputOpcode.SENSING_OF_COSTUME_NAME: { + const targetRef = this.descendTargetReference(node.object); + return `(${targetRef} ? ${targetRef}.getCostumes()[${targetRef}.currentCostume].name : 0)`; + } case InputOpcode.SENSING_OF_SIZE: { + const targetRef = this.descendTargetReference(node.object); + return `(${targetRef} ? ${targetRef}.size : 0)`; + } case InputOpcode.SENSING_OF_VAR: { + const targetRef = this.descendTargetReference(node.object); + const varRef = this.evaluateOnce(`${targetRef} && ${targetRef}.lookupVariableByNameAndType("${sanitize(node.property)}", "", true)`); + return `(${varRef} ? ${varRef}.value : 0)`; + } case InputOpcode.SENSING_TIME_SECOND: + return `(new Date().getSeconds())`; + case InputOpcode.SENSING_TOUCHING_OBJECT: + return `target.isTouchingObject(${this.descendInput(node.object)})`; + case InputOpcode.SENSING_TOUCHING_COLOR: + return `target.isTouchingColor(${this.descendInput(node.color)})`; + case InputOpcode.SENSING_USERNAME: + return 'runtime.ioDevices.userData.getUsername()'; + case InputOpcode.SENSING_TIME_YEAR: + return `(new Date().getFullYear())`; + + case InputOpcode.SENSING_TIMER_GET: + return 'runtime.ioDevices.clock.projectTimer()'; + + case InputOpcode.CONTROL_COUNTER: + return 'runtime.ext_scratch3_control._counter'; + + case InputOpcode.TW_KEY_LAST_PRESSED: + return 'runtime.ioDevices.keyboard.getLastKeyPressed()'; + + case InputOpcode.VAR_GET: + return `${this.referenceVariable(node.variable)}.value`; + + default: + log.warn(`JS: Unknown input: ${block.opcode}`, node); + throw new Error(`JS: Unknown input: ${block.opcode}`); } - log.warn(`JS: Unknown input: ${getNameForType(node.kind)} (${node.kind})`, node); - throw new Error(`JS: Unknown input: ${getNameForType(node.kind)} (${node.kind})`); } /** - * @param {*} node Stacked node to compile. + * @param {IntermediateStackBlock} block Stacked block to compile. */ - descendStackedBlock (node) { - switch (node.kind) { - case BLOCKS.ADDONS.CALL: + descendStackedBlock (block) { + const node = block.inputs; + switch (block.opcode) { + case StackOpcode.ADDON_CALL: { this.source += `${this.descendAddonCall(node)};\n`; break; + } + + case StackOpcode.EXTENSION: + this.source += `${this.generateExtensionCompilerSource(node)};\n`; + break; + + case StackOpcode.RAW_SOURCE: + this.source += `${this.generateRawSource(node.fragments)}\n`; + break; - case BLOCKS.COMPAT: { + case StackOpcode.COMPATIBILITY_LAYER: { // If the last command in a loop returns a promise, immediately continue to the next iteration. // If you don't do this, the loop effectively yields twice per iteration and will run at half-speed. const isLastInLoop = this.isLastBlockInLoop(); @@ -1255,9 +559,6 @@ class JSGenerator { this.source += `${this.generateCompatibilityLayerCall(node, isLastInLoop)};\n`; } else if (blockType === BlockType.CONDITIONAL || blockType === BlockType.LOOP) { const branchVariable = this.localVariables.next(); - if (blockType === BlockType.LOOP) { - this._clearLoopAssignedTypes(node.substacks); - } this.source += `const ${branchVariable} = createBranchInfo(${blockType === BlockType.LOOP});\n`; this.source += `while (${branchVariable}.branch = +(${this.generateCompatibilityLayerCall(node, false, branchVariable)})) {\n`; this.source += `switch (${branchVariable}.branch) {\n`; @@ -1281,141 +582,114 @@ class JSGenerator { break; } - case BLOCKS.EXTENSION: { - const call = this.generateCompiledExtensionCall(node); - this.source += `${typeof call === 'string' ? call : call.source};\n`; + case InputOpcode.OLD_COMPILER_COMPATIBILITY_LAYER: + return this.oldCompilerStub.descendStackedBlockFromNewCompiler(block); + + case StackOpcode.HAT_EDGE: + this.isInHat = true; + this.source += '{\n'; + // For exact Scratch parity, evaluate the input before checking old edge state. + // Can matter if the input is not instantly evaluated. + this.source += `const resolvedValue = ${this.descendInput(node.condition)};\n`; + this.source += `const id = "${sanitize(node.id)}";\n`; + this.source += 'const hasOldEdgeValue = target.hasEdgeActivatedValue(id);\n'; + this.source += `const oldEdgeValue = target.updateEdgeActivatedValue(id, resolvedValue);\n`; + this.source += `const edgeWasActivated = hasOldEdgeValue ? (!oldEdgeValue && resolvedValue) : resolvedValue;\n`; + this.source += `if (!edgeWasActivated) {\n`; + this.retire(); + this.source += '}\n'; + this.source += 'yield;\n'; + this.source += '}\n'; + this.isInHat = false; break; - } - case BLOCKS.CONTROL.CREATE_CLONE: - this.source += `runtime.ext_scratch3_control._createClone(${this.descendInput(node.target).asString()}, target);\n`; + case StackOpcode.HAT_PREDICATE: + this.isInHat = true; + this.source += `if (!${this.descendInput(node.condition)}) {\n`; + this.retire(); + this.source += '}\n'; + this.source += 'yield;\n'; + this.isInHat = false; break; - case BLOCKS.CONTROL.DELETE_CLONE: + + case StackOpcode.CONTROL_CLONE_CREATE: + this.source += `runtime.ext_scratch3_control._createClone(${this.descendInput(node.target)}, target);\n`; + break; + case StackOpcode.CONTROL_CLONE_DELETE: this.source += 'if (!target.isOriginal) {\n'; this.source += ' runtime.disposeTarget(target);\n'; this.source += ' runtime.stopForTarget(target);\n'; this.retire(); this.source += '}\n'; break; - case BLOCKS.CONTROL.FOR: { + case StackOpcode.CONTROL_FOR: { const index = this.localVariables.next(); this.source += `var ${index} = 0; `; - this.source += `while (${index} < ${this.descendInput(node.count).asNumber()}) { `; + this.source += `while (${index} < ${this.descendInput(node.count)}) { `; this.source += `${index}++; `; - const loopVarRef = this.referenceVariable(node.variable); - this.source += `${loopVarRef}.value = ${index};\n`; - this._clearLoopAssignedTypes(node.do); - // The loop index variable is always an integer. - this.setVariableType(`${loopVarRef}.value`, TYPES.NUMBER_INT); + this.source += `${this.referenceVariable(node.variable)}.value = ${index};\n`; this.descendStack(node.do, new Frame(true)); this.yieldLoop(); this.source += '}\n'; break; } - case BLOCKS.CONTROL.IF: - { - const conditionInput = this.descendInput(node.condition); - const entryTypeCtxs = this.cloneTypeCtxs(); - - // If the condition is known at compile time, remove the if wrapper entirely. - // - true: inline the if body - // - false: remove the if body (or inline else branch if present) - if (conditionInput.isAlwaysConstant()) { - const conditionIsTrue = Cast.toBoolean(conditionInput.constantValue); - this.typeCtxs = this.cloneTypeCtxs(entryTypeCtxs); - - if (conditionIsTrue) { - this.descendStack(node.whenTrue, new Frame(false)); - } else if (node.whenFalse.length) { - this.descendStack(node.whenFalse, new Frame(false)); - } - break; - } - - const condition = conditionInput.asBoolean(); - const entryEffective = this.computeEffectiveTypeMap(entryTypeCtxs); - - this.source += `if (${condition}) {\n`; - - this.typeCtxs = this.cloneTypeCtxs(entryTypeCtxs); + case StackOpcode.CONTROL_IF_ELSE: + this.source += `if (${this.descendInput(node.condition)}) {\n`; this.descendStack(node.whenTrue, new Frame(false)); - const trueEffective = this.computeEffectiveTypeMap(this.typeCtxs); - - let falseEffective = entryEffective; // only add the else branch if it won't be empty // this makes scripts have a bit less useless noise in them - if (node.whenFalse.length) { - this.resetVariableInputs(); + if (node.whenFalse.blocks.length) { this.source += `} else {\n`; - - // Compile the false branch starting from the entry types. - this.typeCtxs = this.cloneTypeCtxs(entryTypeCtxs); this.descendStack(node.whenFalse, new Frame(false)); - falseEffective = this.computeEffectiveTypeMap(this.typeCtxs); - } - - this.typeCtxs = this.cloneTypeCtxs(entryTypeCtxs); - const mergedKeys = new Set([ - ...entryEffective.keys(), - ...trueEffective.keys(), - ...falseEffective.keys() - ]); - - for (const name of mergedKeys) { - const entryT = entryEffective.has(name) ? entryEffective.get(name) : TYPES.ANY; - const tTrue = trueEffective.has(name) ? trueEffective.get(name) : entryT; - const tFalse = falseEffective.has(name) ? falseEffective.get(name) : entryT; - const merged = tTrue | tFalse; - if (merged === TYPES.ANY) { - this.clearVariableType(name); - } else { - this.setVariableType(name, merged); - } } - this.source += `}\n`; break; - } - case BLOCKS.CONTROL.REPEAT: { - const timesInput = this.descendInput(node.times); + case StackOpcode.CONTROL_SWITCH: + this.source += `switch (${this.descendInput(node.value)}) {\n`; + this.descendStack(node.do, new Frame(false)); + this.source += `}\n`; + break; + case StackOpcode.CONTROL_CASE: + this.source += `case ${this.descendInput(node.value)}: {\n`; + this.descendStack(node.do, new Frame(false)); + this.source += 'break; }\n'; + break; + case StackOpcode.CONTROL_DEFAULT: + this.source += 'default:\n'; + this.descendStack(node.do, new Frame(false)); + break; + case StackOpcode.CONTROL_BREAK: + this.source += 'break;\n'; + break; + case StackOpcode.CONTROL_CASE_FALLTHROUGH: + this.source += `case ${this.descendInput(node.value)}:\n`; + break; + case StackOpcode.CONTROL_REPEAT: { const i = this.localVariables.next(); - let intCount = null; - if (timesInput.isAlwaysConstant()) { - const c = +timesInput.constantValue; - if (Number.isInteger(c) && c >= 0 && c <= 0x7fffffff) { - intCount = c; - } - } - if (intCount === null) { - this.source += `for (var ${i} = ${timesInput.asNumber()}; ${i} >= 0.5; ${i}--) {\n`; + if (node.times.isAlwaysType(InputType.NUMBER_INT | InputType.NUMBER_INF)) { + this.source += `for (var ${i} = ${this.descendInput(node.times)}; ${i} > 0; ${i}--) {\n`; } else { - this.source += `for (var ${i} = ${intCount}; ${i} > 0; ${i}--) {\n`; + this.source += `for (var ${i} = ${this.descendInput(node.times)}; ${i} >= 0.5; ${i}--) {\n`; } - this._clearLoopAssignedTypes(node.do); this.descendStack(node.do, new Frame(true)); this.yieldLoop(); this.source += `}\n`; break; } - case BLOCKS.CONTROL.STOP_ALL: + case StackOpcode.CONTROL_STOP_ALL: this.source += 'runtime.stopAll();\n'; this.retire(); break; - case BLOCKS.CONTROL.STOP_OTHERS: + case StackOpcode.CONTROL_STOP_OTHERS: this.source += 'runtime.stopForTarget(target, thread);\n'; break; - case BLOCKS.CONTROL.STOP_SCRIPT: - if (this._inlineStopLabel) { - this.source += `break ${this._inlineStopLabel};\n`; - } else { - this.stopScript(); - } + case StackOpcode.CONTROL_STOP_SCRIPT: + this.stopScript(); break; - case BLOCKS.CONTROL.WAIT: { + case StackOpcode.CONTROL_WAIT: { const duration = this.localVariables.next(); - this.usedMathFunctions.add('max'); this.source += `thread.timer = timer();\n`; - this.source += `var ${duration} = max(0, 1000 * ${this.descendInput(node.seconds).asNumber()});\n`; + this.source += `var ${duration} = Math.max(0, 1000 * ${this.descendInput(node.seconds)});\n`; this.requestRedraw(); // always yield at least once, even on 0 second durations this.yieldNotWarp(); @@ -1425,17 +699,14 @@ class JSGenerator { this.source += 'thread.timer = null;\n'; break; } - case BLOCKS.CONTROL.WAIT_UNTIL: { - this.resetVariableInputs(); - this.source += `while (!${this.descendInput(node.condition).asBoolean()}) {\n`; + case StackOpcode.CONTROL_WAIT_UNTIL: { + this.source += `while (!${this.descendInput(node.condition)}) {\n`; this.yieldStuckOrNotWarp(); this.source += `}\n`; break; } - case BLOCKS.CONTROL.WHILE: - this.resetVariableInputs(); - this._clearLoopAssignedTypes(node.do); - this.source += `while (${this.descendInput(node.condition).asBoolean()}) {\n`; + case StackOpcode.CONTROL_WHILE: + this.source += `while (${this.descendInput(node.condition)}) {\n`; this.descendStack(node.do, new Frame(true)); if (node.warpTimer) { this.yieldStuckOrNotWarp(); @@ -1444,480 +715,351 @@ class JSGenerator { } this.source += `}\n`; break; - - case BLOCKS.COUNTER.CLEAR: + case StackOpcode.CONTROL_CLEAR_COUNTER: this.source += 'runtime.ext_scratch3_control._counter = 0;\n'; break; - case BLOCKS.COUNTER.INCR: + case StackOpcode.CONTORL_INCR_COUNTER: this.source += 'runtime.ext_scratch3_control._counter++;\n'; break; - case BLOCKS.HAT.EDGE: - this.isInHat = true; - this.source += '{\n'; - // For exact Scratch parity, evaluate the input before checking old edge state. - // Can matter if the input is not instantly evaluated. - this.source += `const resolvedValue = ${this.descendInput(node.condition).asBoolean()};\n`; - this.source += `const id = "${sanitize(node.id)}";\n`; - this.source += 'const hasOldEdgeValue = target.hasEdgeActivatedValue(id);\n'; - this.source += `const oldEdgeValue = target.updateEdgeActivatedValue(id, resolvedValue);\n`; - this.source += `const edgeWasActivated = hasOldEdgeValue ? (!oldEdgeValue && resolvedValue) : resolvedValue;\n`; - this.source += `if (!edgeWasActivated) {\n`; - this.retire(); - this.source += '}\n'; - this.source += 'yield;\n'; - this.source += '}\n'; - this.isInHat = false; - break; - case BLOCKS.HAT.PREDICATE: - this.isInHat = true; - this.source += `if (!${this.descendInput(node.condition).asBoolean()}) {\n`; - this.retire(); - this.source += '}\n'; - this.source += 'yield;\n'; - this.isInHat = false; - break; - - case BLOCKS.EVENT.BROADCAST: - this.source += `startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: ${this.descendInput(node.broadcast).asString()} });\n`; - this.resetVariableInputs(); - this.clearVariableTypes(); + case StackOpcode.EVENT_BROADCAST: + this.source += `startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: ${this.descendInput(node.broadcast)} });\n`; break; - case BLOCKS.EVENT.BROADCAST_AND_WAIT: - this.source += `yield* waitThreads(startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: ${this.descendInput(node.broadcast).asString()} }));\n`; + case StackOpcode.EVENT_BROADCAST_AND_WAIT: + this.source += `yield* waitThreads(startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: ${this.descendInput(node.broadcast)} }));\n`; this.yielded(); break; - case BLOCKS.LIST.ADD: { + case StackOpcode.LIST_ADD: { const list = this.referenceVariable(node.list); - this.source += `${list}.value.push(${this.descendInput(node.item).asSafe()});\n`; - this._pushMonitorUpdate(list); + this.source += `${list}.value.push(${this.descendInput(node.item)});\n`; + this.source += `${list}._monitorUpToDate = false;\n`; break; } - case BLOCKS.LIST.DELETE: { + case StackOpcode.LIST_DELETE: { const list = this.referenceVariable(node.list); - const index = this.descendInput(node.index); - if (index.isConstant('last')) { + if (node.index.isConstant('last')) { this.source += `${list}.value.pop();\n`; - this._pushMonitorUpdate(list); + this.source += `${list}._monitorUpToDate = false;\n`; break; } - if (index.isConstant(1)) { + if (node.index.isConstant(1)) { this.source += `${list}.value.shift();\n`; - this._pushMonitorUpdate(list); + this.source += `${list}._monitorUpToDate = false;\n`; break; } // do not need a special case for all as that is handled in IR generation (list.deleteAll) - this.source += `listDelete(${list}, ${index.asUnknown()});\n`; + this.source += `listDelete(${list}, ${this.descendInput(node.index)});\n`; break; } - case BLOCKS.LIST.DELETE_ALL: + case StackOpcode.LIST_DELETE_ALL: this.source += `${this.referenceVariable(node.list)}.value = [];\n`; break; - case BLOCKS.LIST.HIDE: + case StackOpcode.LIST_HIDE: this.source += `runtime.monitorBlocks.changeBlock({ id: "${sanitize(node.list.id)}", element: "checkbox", value: false }, runtime);\n`; break; - case BLOCKS.LIST.INSERT: { + case StackOpcode.LIST_INSERT: { const list = this.referenceVariable(node.list); - const index = this.descendInput(node.index); const item = this.descendInput(node.item); - if (index.isConstant(1)) { - this.source += `${list}.value.unshift(${item.asSafe()});\n`; - this._pushMonitorUpdate(list); - break; - } - if (index.isConstant('last')) { - this.source += `${list}.value.push(${item.asSafe()});\n`; - this._pushMonitorUpdate(list); + if (node.index.isConstant(1)) { + this.source += `${list}.value.unshift(${item});\n`; + this.source += `${list}._monitorUpToDate = false;\n`; break; } - this.source += `listInsert(${list}, ${index.asUnknown()}, ${item.asSafe()});\n`; + this.source += `listInsert(${list}, ${this.descendInput(node.index)}, ${item});\n`; break; } - case BLOCKS.LIST.REPLACE: { - const listRef = this.referenceVariable(node.list); - const idxInput = this.descendInput(node.index); - this.source += `listReplace(${listRef}, ${idxInput.asUnknown()}, ${this.descendInput(node.item).asSafe()});\n`; + case StackOpcode.LIST_REPLACE: + this.source += `listReplace(${this.referenceVariable(node.list)}, ${this.descendInput(node.index)}, ${this.descendInput(node.item)});\n`; break; - } - case BLOCKS.LIST.SHOW: + case StackOpcode.LIST_SHOW: this.source += `runtime.monitorBlocks.changeBlock({ id: "${sanitize(node.list.id)}", element: "checkbox", value: true }, runtime);\n`; break; - - case BLOCKS.LIST.SET_ARRAY: - this.source += `try { ${this.referenceVariable(node.list)}.value = JSON.parse(${this.descendInput(node.array).asString()}) }catch{};\n`; + case StackOpcode.LIST_SET_ARRAY: + this.source += `try { ${this.referenceVariable(node.list)}.value = JSON.parse(${this.descendInput(node.array)}); } catch {}\n`; break; - case BLOCKS.LOOKS.BACKWARD_LAYERS: + case StackOpcode.LOOKS_LAYER_BACKWARD: if (!this.target.isStage) { - this.source += `target.goBackwardLayers(${this.descendInput(node.layers).asNumber()});\n`; + this.source += `target.goBackwardLayers(${this.descendInput(node.layers)});\n`; } break; - case BLOCKS.LOOKS.CLEAR_EFFECTS: + case StackOpcode.LOOKS_EFFECT_CLEAR: this.source += 'target.clearEffects();\n'; break; - case BLOCKS.LOOKS.CHANGE_EFFECT: + case StackOpcode.LOOKS_EFFECT_CHANGE: if (Object.prototype.hasOwnProperty.call(this.target.effects, node.effect)) { - this.source += `target.setEffect("${sanitize(node.effect)}", runtime.ext_scratch3_looks.clampEffect("${sanitize(node.effect)}", ${this.descendInput(node.value).asNumber()} + target.effects["${sanitize(node.effect)}"]));\n`; + this.source += `target.setEffect("${sanitize(node.effect)}", runtime.ext_scratch3_looks.clampEffect("${sanitize(node.effect)}", ${this.descendInput(node.value)} + target.effects["${sanitize(node.effect)}"]));\n`; } break; - case BLOCKS.LOOKS.CHANGE_SIZE: - this.source += `target.setSize(target.size + ${this.descendInput(node.size).asNumber()});\n`; + case StackOpcode.LOOKS_SIZE_CHANGE: + this.source += `target.setSize(target.size + ${this.descendInput(node.size)});\n`; break; - case BLOCKS.LOOKS.FORWARD_LAYERS: + case StackOpcode.LOOKS_LAYER_FORWARD: if (!this.target.isStage) { - this.source += `target.goForwardLayers(${this.descendInput(node.layers).asNumber()});\n`; + this.source += `target.goForwardLayers(${this.descendInput(node.layers)});\n`; } break; - case BLOCKS.LOOKS.GOTO_BACK: + case StackOpcode.LOOKS_LAYER_BACK: if (!this.target.isStage) { this.source += 'target.goToBack();\n'; } break; - case BLOCKS.LOOKS.GOTO_FRONT: + case StackOpcode.LOOKS_LAYER_FRONT: if (!this.target.isStage) { this.source += 'target.goToFront();\n'; } break; - case BLOCKS.LOOKS.HIDE: + case StackOpcode.LOOKS_HIDE: this.source += 'target.setVisible(false);\n'; this.source += 'runtime.ext_scratch3_looks._renderBubble(target);\n'; break; - case BLOCKS.LOOKS.NEXT_BACKDROP: + case StackOpcode.LOOKS_BACKDROP_NEXT: this.source += 'runtime.ext_scratch3_looks._setBackdrop(stage, stage.currentCostume + 1, true);\n'; break; - case BLOCKS.LOOKS.NEXT_COSTUME: + case StackOpcode.LOOKS_COSTUME_NEXT: this.source += 'target.setCostume(target.currentCostume + 1);\n'; break; - case BLOCKS.LOOKS.SET_EFFECT: + case StackOpcode.LOOKS_EFFECT_SET: if (Object.prototype.hasOwnProperty.call(this.target.effects, node.effect)) { - this.source += `target.setEffect("${sanitize(node.effect)}", runtime.ext_scratch3_looks.clampEffect("${sanitize(node.effect)}", ${this.descendInput(node.value).asNumber()}));\n`; + this.source += `target.setEffect("${sanitize(node.effect)}", runtime.ext_scratch3_looks.clampEffect("${sanitize(node.effect)}", ${this.descendInput(node.value)}));\n`; } break; - case BLOCKS.LOOKS.SET_SIZE: - this.source += `target.setSize(${this.descendInput(node.size).asNumber()});\n`; + case StackOpcode.LOOKS_SIZE_SET: + this.source += `target.setSize(${this.descendInput(node.size)});\n`; break; - case BLOCKS.LOOKS.SHOW: + case StackOpcode.LOOKS_SHOW: this.source += 'target.setVisible(true);\n'; this.source += 'runtime.ext_scratch3_looks._renderBubble(target);\n'; break; - case BLOCKS.LOOKS.SWITCH_BACKDROP: - this.source += `runtime.ext_scratch3_looks._setBackdrop(stage, ${this.descendInput(node.backdrop).asUnknown()});\n`; + case StackOpcode.LOOKS_BACKDROP_SET: + this.source += `runtime.ext_scratch3_looks._setBackdrop(stage, ${this.descendInput(node.backdrop)});\n`; break; - case BLOCKS.LOOKS.SWITCH_COSTUME: - this.source += `runtime.ext_scratch3_looks._setCostume(target, ${this.descendInput(node.costume).asUnknown()});\n`; + case StackOpcode.LOOKS_COSTUME_SET: + this.source += `runtime.ext_scratch3_looks._setCostume(target, ${this.descendInput(node.costume)});\n`; break; - case BLOCKS.LOOKS.SAY: - this.source += `runtime.ext_scratch3_looks._say(${this.descendInput(node.message).asSafe()}, target);\n`; + case StackOpcode.LOOKS_SAY: + this.source += `runtime.ext_scratch3_looks._say(${this.descendInput(node.message)}, target);\n`; break; - case BLOCKS.LOOKS.THINK: - this.source += `runtime.ext_scratch3_looks._think(${this.descendInput(node.message).asSafe()}, target);\n`; + case StackOpcode.LOOKS_THINK: + this.source += `runtime.ext_scratch3_looks._think(${this.descendInput(node.message)}, target);\n`; break; - case BLOCKS.MOTION.CHANGE_X: - this.source += `target.setXY(target.x + ${this.descendInput(node.dx).asNumber()}, target.y);\n`; + case StackOpcode.MOTION_X_CHANGE: + this.source += `target.setXY(target.x + ${this.descendInput(node.dx)}, target.y);\n`; break; - case BLOCKS.MOTION.CHANGE_Y: - this.source += `target.setXY(target.x, target.y + ${this.descendInput(node.dy).asNumber()});\n`; + case StackOpcode.MOTION_Y_CHANGE: + this.source += `target.setXY(target.x, target.y + ${this.descendInput(node.dy)});\n`; break; - case BLOCKS.MOTION.IF_ON_EDGE_BOUNCE: + case StackOpcode.MOTION_IF_ON_EDGE_BOUNCE: this.source += `runtime.ext_scratch3_motion._ifOnEdgeBounce(target);\n`; break; - case BLOCKS.MOTION.SET_DIRECTION: - this.source += `target.setDirection(${this.descendInput(node.direction).asNumber()});\n`; + case StackOpcode.MOTION_DIRECTION_SET: + this.source += `target.setDirection(${this.descendInput(node.direction)});\n`; break; - case BLOCKS.MOTION.POINT_TOWARDS_XY: { - this.usedMathFunctions.add('atan'); - this.usedMathFunctions.add('PI'); - const x = this.localVariables.next(); - const y = this.localVariables.next(); - this.source += `const ${x} = ${this.descendInput(node.x).asNumber()};\n`; - this.source += `const ${y} = ${this.descendInput(node.y).asNumber()};\n`; - this.source += `target.setDirection(180 + ((atan((${x} - target.x) / (${y} - target.y)) * 180 / PI) + (${y} > target.y ? 180 : 0)));\n`; + case StackOpcode.MOTION_POINT_TOWARDS_XY: + this.source += `target.setDirection(90 - (Math.atan2(${this.descendInput(node.y)} - target.y, ${this.descendInput(node.x)} - target.x) * 180 / Math.PI));\n`; break; - } - case BLOCKS.MOTION.POINT_TOWARDS_XY_FROM: { - this.usedMathFunctions.add('atan'); - this.usedMathFunctions.add('PI'); - const x = this.localVariables.next(); - const fromx = this.localVariables.next(); - const y = this.localVariables.next(); - const fromy = this.localVariables.next(); - this.source += `const ${x} = ${this.descendInput(node.x).asNumber()};\n`; - this.source += `const ${fromx} = ${this.descendInput(node.fromx).asNumber()};\n`; - this.source += `const ${y} = ${this.descendInput(node.y).asNumber()};\n`; - this.source += `const ${fromy} = ${this.descendInput(node.fromy).asNumber()};\n`; - this.source += `target.setDirection(180 + ((atan((${x} - ${fromx}) / (${y} - ${fromy})) * 180 / PI) + (${y} > ${fromy} ? 180 : 0)));\n`; + case StackOpcode.MOTION_POINT_TOWARDS_XY_FROM: + this.source += `target.setDirection(90 - (Math.atan2(${this.descendInput(node.y)} - ${this.descendInput(node.fromY)}, ${this.descendInput(node.x)} - ${this.descendInput(node.fromX)}) * 180 / Math.PI));\n`; break; - } - case BLOCKS.MOTION.SET_ROTATION_STYLE: + case StackOpcode.MOTION_ROTATION_STYLE_SET: this.source += `target.setRotationStyle("${sanitize(node.style)}");\n`; break; - case BLOCKS.MOTION.SET_X: // fallthrough - case BLOCKS.MOTION.SET_Y: // fallthrough - case BLOCKS.MOTION.SET_XY: { + case StackOpcode.MOTION_X_SET: // fallthrough + case StackOpcode.MOTION_Y_SET: // fallthrough + case StackOpcode.MOTION_XY_SET: { this.descendedIntoModulo = false; - const x = 'x' in node ? this.descendInput(node.x).asNumber() : 'target.x'; - const y = 'y' in node ? this.descendInput(node.y).asNumber() : 'target.y'; + const x = 'x' in node ? this.descendInput(node.x) : 'target.x'; + const y = 'y' in node ? this.descendInput(node.y) : 'target.y'; this.source += `target.setXY(${x}, ${y});\n`; if (this.descendedIntoModulo) { this.source += `if (target.interpolationData) target.interpolationData = null;\n`; } break; } - case BLOCKS.MOTION.STEP: - this.source += `runtime.ext_scratch3_motion._moveSteps(${this.descendInput(node.steps).asNumber()}, target);\n`; + case StackOpcode.MOTION_STEP: + this.source += `runtime.ext_scratch3_motion._moveSteps(${this.descendInput(node.steps)}, target);\n`; break; - case BLOCKS.NOOP: + case StackOpcode.NOP: break; - case BLOCKS.PEN.CLEAR: + case StackOpcode.PEN_CLEAR: this.source += `${PEN_EXT}.clear();\n`; break; - case BLOCKS.PEN.DOWN: + case StackOpcode.PEN_DOWN: this.source += `${PEN_EXT}._penDown(target);\n`; break; - case BLOCKS.PEN.CHANGE_PARAM: - this.source += `${PEN_EXT}._setOrChangeColorParam(${this.descendInput(node.param).asString()}, ${this.descendInput(node.value).asNumber()}, ${PEN_STATE}, true);\n`; + case StackOpcode.PEN_COLOR_PARAM_CHANGE: + this.source += `${PEN_EXT}._setOrChangeColorParam(${this.descendInput(node.param)}, ${this.descendInput(node.value)}, ${PEN_STATE}, true);\n`; break; - case BLOCKS.PEN.CHANGE_SIZE: - this.source += `${PEN_EXT}._changePenSizeBy(${this.descendInput(node.size).asNumber()}, target);\n`; + case StackOpcode.PEN_SIZE_CHANGE: + this.source += `${PEN_EXT}._changePenSizeBy(${this.descendInput(node.size)}, target);\n`; break; - case BLOCKS.PEN.LEGACY_CHANGE_HUE: - this.source += `${PEN_EXT}._changePenHueBy(${this.descendInput(node.hue).asNumber()}, target);\n`; + case StackOpcode.PEN_COLOR_HUE_CHANGE_LEGACY: + this.source += `${PEN_EXT}._changePenHueBy(${this.descendInput(node.hue)}, target);\n`; break; - case BLOCKS.PEN.LEGACY_CHANGE_SHADE: - this.source += `${PEN_EXT}._changePenShadeBy(${this.descendInput(node.shade).asNumber()}, target);\n`; + case StackOpcode.PEN_COLOR_SHADE_CHANGE_LEGACY: + this.source += `${PEN_EXT}._changePenShadeBy(${this.descendInput(node.shade)}, target);\n`; break; - case BLOCKS.PEN.LEGACY_SET_HUE: - this.source += `${PEN_EXT}._setPenHueToNumber(${this.descendInput(node.hue).asNumber()}, target);\n`; + case StackOpcode.PEN_COLOR_HUE_SET_LEGACY: + this.source += `${PEN_EXT}._setPenHueToNumber(${this.descendInput(node.hue)}, target);\n`; break; - case BLOCKS.PEN.LEGACY_SET_SHADE: - this.source += `${PEN_EXT}._setPenShadeToNumber(${this.descendInput(node.shade).asNumber()}, target);\n`; + case StackOpcode.PEN_COLOR_SHADE_SET_LEGACY: + this.source += `${PEN_EXT}._setPenShadeToNumber(${this.descendInput(node.shade)}, target);\n`; break; - case BLOCKS.PEN.SET_COLOR: - this.source += `${PEN_EXT}._setPenColorToColor(${this.descendInput(node.color).asColor()}, target);\n`; + case StackOpcode.PEN_COLOR_SET: + this.source += `${PEN_EXT}._setPenColorToColor(${this.descendInput(node.color)}, target);\n`; break; - case BLOCKS.PEN.SET_PARAM: - this.source += `${PEN_EXT}._setOrChangeColorParam(${this.descendInput(node.param).asString()}, ${this.descendInput(node.value).asNumber()}, ${PEN_STATE}, false);\n`; + case StackOpcode.PEN_COLOR_PARAM_SET: + this.source += `${PEN_EXT}._setOrChangeColorParam(${this.descendInput(node.param)}, ${this.descendInput(node.value)}, ${PEN_STATE}, false);\n`; break; - case BLOCKS.PEN.SET_SIZE: - this.source += `${PEN_EXT}._setPenSizeTo(${this.descendInput(node.size).asNumber()}, target);\n`; + case StackOpcode.PEN_SIZE_SET: + this.source += `${PEN_EXT}._setPenSizeTo(${this.descendInput(node.size)}, target);\n`; break; - case BLOCKS.PEN.STAMP: + case StackOpcode.PEN_STAMP: this.source += `${PEN_EXT}._stamp(target);\n`; break; - case BLOCKS.PEN.PRINT_TEXT: - this.source += `${PEN_EXT}._printText(${this.descendInput(node.text).asSafe()}, ${this.descendInput(node.x).asNumber()}, ${this.descendInput(node.y).asNumber()}, target);\n`; + case StackOpcode.PEN_PRINT_TEXT: + this.source += `${PEN_EXT}._printText(${this.descendInput(node.text)}, ${this.descendInput(node.x)}, ${this.descendInput(node.y)}, target);\n`; break; - case BLOCKS.PEN.DRAW_TRIANGLE: - this.source += `${PEN_EXT}._triangle(${this.descendInput(node.x0).asNumber()}, ${this.descendInput(node.y0).asNumber()}, ${this.descendInput(node.x1).asNumber()}, ${this.descendInput(node.y1).asNumber()}, ${this.descendInput(node.x2).asNumber()}, ${this.descendInput(node.y2).asNumber()}, target);\n`; + case StackOpcode.PEN_DRAW_TRIANGLE: + this.source += `${PEN_EXT}._triangle(${this.descendInput(node.x0)}, ${this.descendInput(node.y0)}, ${this.descendInput(node.x1)}, ${this.descendInput(node.y1)}, ${this.descendInput(node.x2)}, ${this.descendInput(node.y2)}, target);\n`; break; - case BLOCKS.PEN.UP: + case StackOpcode.PEN_UP: this.source += `${PEN_EXT}._penUp(target);\n`; break; - case BLOCKS.PROCEDURES.CALL: { + case StackOpcode.PROCEDURE_CALL: { const procedureCode = node.code; const procedureVariant = node.variant; const procedureData = this.ir.procedures[procedureVariant]; - const stack = procedureData.stack; - if (stack === null || stack.length === 0) { - // Procedure has no body; still evaluate arguments for side effects + if (procedureData.stack === null) { + // TODO still need to evaluate arguments break; } - - if (this._canInlineProcedureCallInStack(node, procedureData)) { - this._emitInlinedProcedureCallInStack(node, procedureData); - this.resetVariableInputs(); - this._clearWrittenGlobals(this._getProcedureWrittenVars(procedureVariant)); - break; - } - const yieldForRecursion = !this.isWarp && procedureCode === this.script.procedureCode; if (yieldForRecursion) { + // Direct yields. this.yieldNotWarp(); } - - if (node.arguments.length === 0 && stack.length === 1) { - if ([BLOCKS.VAR.SET].includes(stack[0].kind)) { - this.descendStack(stack, new Frame(false)); - break; - } - } - if (procedureData.yields) { this.source += 'yield* '; + if (!this.script.yields) { + throw new Error('Script uses yielding procedure but is not marked as yielding.'); + } } this.source += `thread.procedures["${sanitize(procedureVariant)}"](`; const args = []; for (const input of node.arguments) { - args.push(this.descendInput(input).asSafe()); + args.push(this.descendInput(input)); } this.source += args.join(','); - this.source += ');\n'; - - this.resetVariableInputs(); - if (procedureData.yields || yieldForRecursion) { - this.clearVariableTypes(); - } else { - this._clearWrittenGlobals(this._getProcedureWrittenVars(procedureVariant)); - } + this.source += `);\n`; break; } - case BLOCKS.PROCEDURES.RETURN: - this.stopScriptAndReturn(this.descendInput(node.value).asSafe()); + case StackOpcode.PROCEDURE_RETURN: + this.stopScriptAndReturn(this.descendInput(node.value)); break; - case BLOCKS.TIMER.RESET: + case StackOpcode.SENSING_TIMER_RESET: this.source += 'runtime.ioDevices.clock.resetProjectTimer();\n'; break; - case BLOCKS.TW.DEBUGGER: + case StackOpcode.DEBUGGER: this.source += 'debugger;\n'; break; - case BLOCKS.VAR.HIDE: + case StackOpcode.VAR_HIDE: this.source += `runtime.monitorBlocks.changeBlock({ id: "${sanitize(node.variable.id)}", element: "checkbox", value: false }, runtime);\n`; break; - case BLOCKS.VAR.SET: { - const variable = this.descendVariable(node.variable); - const value = this.descendInput(node.value); - this.variableInputs[node.variable.id] = variable; - variable.setInput(value); - // const valueType = variable.type; - // this.source += `// Set variable ${node.variable.name} (type: ${valueType})\n`; - this.source += `${variable.source} = ${value.asSafe()};\n`; + case StackOpcode.VAR_SET: { + const varReference = this.referenceVariable(node.variable); + this.source += `${varReference}.value = ${this.descendInput(node.value)};\n`; if (node.variable.isCloud) { - this.source += `runtime.ioDevices.cloud.requestUpdateVariable("${sanitize(node.variable.name)}", ${variable.source});\n`; + this.source += `runtime.ioDevices.cloud.requestUpdateVariable("${sanitize(node.variable.name)}", ${varReference}.value);\n`; } break; } - case BLOCKS.VAR.SHOW: + case StackOpcode.VAR_SHOW: this.source += `runtime.monitorBlocks.changeBlock({ id: "${sanitize(node.variable.id)}", element: "checkbox", value: true }, runtime);\n`; break; - case BLOCKS.VISUAL_REPORT: { + case StackOpcode.VISUAL_REPORT: { const value = this.localVariables.next(); - this.source += `const ${value} = ${this.descendInput(node.input).asUnknown()};`; + this.source += `const ${value} = ${this.descendInput(node.input)};`; // blocks like legacy no-ops can return a literal `undefined` - this.source += `runtime.visualReport("${sanitize(this.script.topBlockId || '')}", ${value});\n`; - break; - } - - case BLOCKS.CONTROL.SWITCH: { - const value = this.descendInput(node.value); - let discriminant; - if (node.useNumbers === true) { - // Numeric `=` if-chain conversion: a non-numeric subject becomes NaN so it matches - // no case, as Scratch's `=` would. - discriminant = `toSwitchNumber(${value.asUnknown()})`; - } else if (node.useNumbers === false) { - // String `=` if-chain conversion: Scratch `=` is case-insensitive. Case labels are - // lowercased in irgen, so lowercase the subject to match. - discriminant = `(${value.asString()}).toLowerCase()`; - } else { - // Native control_switch block: case-sensitive string match, like the interpreter. - discriminant = value.asString(); - } - this.source += `switch (${discriminant}) {\n`; - this.descendStack(node.do, new Frame(false)); - this.source += `}\n`; + this.source += `if (${value} !== undefined) runtime.visualReport(target, "${sanitize(this.script.topBlockId)}", ${value});\n`; break; } - case BLOCKS.CONTROL.CASE: { - const value = this.descendInput(node.value); - this.source += `case ${node.useNumbers ? value.asNumber() : value.asString()}: {\n`; - this.descendStack(node.do, new Frame(false)); - this.source += 'break; }\n'; - break; - } - case BLOCKS.CONTROL.DEFAULT: { - this.source += `default:\n`; - - this.descendStack(node.do, new Frame(false)); - break; - } - case BLOCKS.CONTROL.BREAK: { - this.source += 'break;\n'; - break; - } - case BLOCKS.CONTROL.CASE_FALLTHROUGH: { - const value = this.descendInput(node.value); - this.source += `case ${node.useNumbers ? value.asNumber() : value.asString()}:\n`; - // No break statement - allows fallthrough to next case - break; + default: + log.warn(`JS: Unknown stacked block: ${block.opcode}`, node); + throw new Error(`JS: Unknown stacked block: ${block.opcode}`); } + } - default: - log.warn(`JS: Unknown stacked block: ${getNameForType(node.kind)} (${node.kind})`, node); - throw new Error(`JS: Unknown stacked block: ${getNameForType(node.kind)} (${node.kind})`); + /** + * Compiles a reference to a target. + * @param {IntermediateInput} input The target reference. Must be a string. + * @returns {string} The compiled target reference + */ + descendTargetReference (input) { + if (!input.isAlwaysType(InputType.STRING)) { + throw new Error(`JS: Object references must be strings!`); } + if (input.isConstant('_stage_')) return 'stage'; + return this.evaluateOnce(`runtime.getSpriteTargetByName(${this.descendInput(input)})`); } /** * Compile a Record of input objects into a safe JS string. - * @param {Record} inputs + * @param {Record} inputs * @returns {string} */ descendInputRecord (inputs) { let result = '{'; for (const name of Object.keys(inputs)) { const node = inputs[name]; - result += `"${sanitize(name)}":${this.descendInput(node).asSafe()},`; + result += `"${sanitize(name)}":${this.descendInput(node)},`; } result += '}'; return result; } - resetVariableInputs () { - this.variableInputs = Object.create(null); - } - /** - * @param {node[]} nodes + * @param {IntermediateStack} stack * @param {Frame} frame */ - descendStack (nodes, frame) { + descendStack (stack, frame) { // Entering a stack -- all bets are off. // TODO: allow if/else to inherit values - this.resetVariableInputs(); this.pushFrame(frame); - for (let i = 0; i < nodes.length; i++) { - frame.isLastBlock = i === nodes.length - 1; - this.descendStackedBlock(nodes[i]); + for (let i = 0; i < stack.blocks.length; i++) { + frame.isLastBlock = i === stack.blocks.length - 1; + this.descendStackedBlock(stack.blocks[i]); } // Leaving a stack -- any assumptions made in the current stack do not apply outside of it // TODO: in if/else this might create an extra unused object - this.resetVariableInputs(); this.popFrame(); } /** - * @param {Variable} variable - * @returns {VariableInput} + * @param {*} node + * @returns {string} */ - descendVariable (variable) { - let input; - if (Object.prototype.hasOwnProperty.call(this.variableInputs, variable.id)) { - input = this.variableInputs[variable.id]; - } else { - input = new VariableInput(`${this.referenceVariable(variable)}.value`); - const knownType = this.getVariableType(input.source); - if (typeof knownType === 'number') { - input.type = knownType; - } - this.variableInputs[variable.id] = input; - } - return input; + descendAddonCall (node) { + const inputs = this.descendInputRecord(node.arguments); + const blockFunction = `runtime.getAddonBlock("${sanitize(node.code)}").callback`; + const blockId = `"${sanitize(node.blockId)}"`; + return `yield* executeInCompatibilityLayer(${inputs}, ${blockFunction}, ${this.isWarp}, false, ${blockId})`; } /** - * @param {Variable} variable + * @param {*} variable * @returns {string} */ referenceVariable (variable) { @@ -1927,17 +1069,6 @@ class JSGenerator { return this.evaluateOnce(`stage.variables["${sanitize(variable.id)}"]`); } - /** - * @param {node} node - * @returns {string} - */ - descendAddonCall (node) { - const inputs = this.descendInputRecord(node.arguments); - const blockFunction = `runtime.getAddonBlock("${sanitize(node.code)}").callback`; - const blockId = `"${sanitize(node.blockId)}"`; - return `yield* executeInCompatibilityLayer(${inputs}, ${blockFunction}, ${this.isWarp}, false, ${blockId})`; - } - /** * @param {string} source * @returns {string} @@ -1962,26 +1093,6 @@ class JSGenerator { } } - stopScript () { - this._flushMonitorUpdates(); - if (this.isProcedure) { - this.source += 'return "";\n'; - } else { - this.retire(); - } - } - - /** - * @param {string} valueJS JS code of value to return. - */ - stopScriptAndReturn (valueJS) { - if (this.isProcedure) { - this.source += `return ${valueJS};\n`; - } else { - this.retire(); - } - } - yieldLoop () { if (this.warpTimer) { this.yieldStuckOrNotWarp(); @@ -2017,9 +1128,6 @@ class JSGenerator { throw new Error('Script yielded but is not marked as yielding.'); } // Control may have been yielded to another script -- all bets are off. - this.resetVariableInputs(); - this.clearVariableTypes(); - this._flushMonitorUpdates(); } /** @@ -2029,18 +1137,9 @@ class JSGenerator { this.source += 'runtime.requestRedraw();\n'; } - /** - * @param {ConstantValue} value - * @returns {ConstantInput} - */ - safeConstantInput (value) { - const unsafe = typeof value === 'string' && this.namesOfCostumesAndSounds.has(value); - return new ConstantInput(value, !unsafe); - } - /** * Generate a call into the compatibility layer. - * @param {*} node The "compat" kind node to generate from. + * @param {*} node The node of the block to generate from. * @param {boolean} setFlags Whether flags should be set describing how this function was processed. * @param {string|null} [frameName] Name of the stack frame variable, if any * @returns {string} The JS of the call. @@ -2052,33 +1151,75 @@ class JSGenerator { for (const inputName of Object.keys(node.inputs)) { const input = node.inputs[inputName]; - const compiledInput = this.descendInput(input).asSafe(); + const compiledInput = this.descendInput(input); result += `"${sanitize(inputName)}":${compiledInput},`; } for (const fieldName of Object.keys(node.fields)) { const field = node.fields[fieldName]; result += `"${sanitize(fieldName)}":"${sanitize(field)}",`; } + if (node.mutation) { + result += `"mutation":${JSON.stringify(node.mutation)},`; + } const opcodeFunction = this.evaluateOnce(`runtime.getOpcodeFunction("${sanitize(opcode)}")`); result += `}, ${opcodeFunction}, ${this.isWarp}, ${setFlags}, "${sanitize(node.id)}", ${frameName})`; + this.yielded(); + return result; } - generateCompiledExtensionCall (node) { - const info = compiledExtensions.get(node.opcode); - const source = info.generate(node, this, info); - return info.type === null ? source : new TypedInput(source, info.type); + generateExtensionCompilerSource (node) { + const getInput = (name, type) => { + const value = node.inputs[name]; + if (!value) return '""'; + if (type === 'raw' && value.opcode === InputOpcode.CONSTANT) return `${value.inputs.value}`; + const inputType = { + number: InputType.NUMBER, + numberOrNaN: InputType.NUMBER_OR_NAN, + string: InputType.STRING, + boolean: InputType.BOOLEAN + }[type]; + return this.descendInput(inputType ? value.toType(inputType) : value); + }; + const input = name => getInput(name); + input.raw = name => getInput(name, 'raw'); + input.number = name => getInput(name, 'number'); + input.numberOrNaN = name => getInput(name, 'numberOrNaN'); + input.string = name => getInput(name, 'string'); + input.boolean = name => getInput(name, 'boolean'); + const source = node.compiler.compile({ + input, + field: name => JSON.stringify(node.fields[name] ?? ''), + mutation: node.mutation, + runtime: 'runtime', + target: 'target', + stage: 'stage' + }); + if (typeof source !== 'string') throw new TypeError('Extension compiler must return JavaScript source'); + return source; + } + + /** + * Join raw JavaScript source fragments without quoting literal text. + * Non-literal inputs remain ordinary compiled JavaScript expressions. + * Nested patch blocks splice verbatim: their source may be a partial + * fragment such as `}${`, which parentheses would turn into a syntax error. + * @param {IntermediateInput[]} fragments Source fragments. + * @returns {string} JavaScript source. + */ + generateRawSource (fragments) { + return fragments.map(fragment => { + if (fragment.opcode === InputOpcode.CONSTANT) return `${fragment.inputs.value}`; + if (fragment.opcode === InputOpcode.RAW_SOURCE) return this.generateRawSource(fragment.inputs.fragments); + return this.descendInput(fragment); + }).join(''); } getScriptFactoryName () { return factoryNameVariablePool.next(); } - /** - * @param {boolean} yields - * @returns {string} - */ getScriptName (yields) { let name = yields ? generatorNameVariablePool.next() : functionNameVariablePool.next(); if (this.isProcedure) { @@ -2091,6 +1232,25 @@ class JSGenerator { return name; } + stopScript () { + if (this.isProcedure) { + this.source += 'return "";\n'; + } else { + this.retire(); + } + } + + /** + * @param {string} valueJS JS code of value to return. + */ + stopScriptAndReturn (valueJS) { + if (this.isProcedure) { + this.source += `return ${valueJS};\n`; + } else { + this.retire(); + } + } + /** * Generate the JS to pass into eval() based on the current state of the compiler. * @returns {string} JS to pass into eval() @@ -2099,32 +1259,10 @@ class JSGenerator { let script = ''; // Setup the factory - script += `(function ${this.getScriptFactoryName()}(thread) {\n`; - script += 'const target = thread.target;\n'; - script += 'const runtime = target.runtime;\n'; + script += `(function ${this.getScriptFactoryName()}(thread) { `; + script += 'const target = thread.target; '; + script += 'const runtime = target.runtime; '; script += 'const stage = runtime.getTargetForStage();\n'; - - for (const [_, fn] of this.prependFunctions) { - script += `${fn};\n`; - } - - // Inject cached Math prelude if we recorded usages during compilation. - if (this.usedMathFunctions && this.usedMathFunctions.size) { - // Build a set of math keys to emit. Include simple dependencies (PI for DEG/RAD constants). - const mathKeys = new Set(); - for (const k of this.usedMathFunctions) { - if (k in MATH_CACHE) mathKeys.add(k); - if (k === 'DEG_TO_RAD' || k === 'RAD_TO_DEG') mathKeys.add('PI'); - } - // Ensure deterministic order for stable output (prefer the order in MATH_CACHE) - const ordered = Object.keys(MATH_CACHE).filter(k => mathKeys.has(k)); - if (ordered.length) { - for (const key of ordered) { - script += `${MATH_CACHE[key]}\n`; - } - } - } - for (const varValue of Object.keys(this._setupVariables)) { const varName = this._setupVariables[varValue]; script += `const ${varName} = ${varValue};\n`; @@ -2160,7 +1298,6 @@ class JSGenerator { * @returns {Function} The factory function for the script. */ compile () { - setCurrentGenerator(this); if (this.script.stack) { this.descendStack(this.script.stack, new Frame(false)); } @@ -2177,70 +1314,23 @@ class JSGenerator { JSGenerator.testingApparatus.report(this, factory); } - setCurrentGenerator(null); return fn; } - - /** - * @param {string} name - * @param {number} type - */ - setVariableType (name, type) { - const ctxs = this.typeCtxs; - for (let i = ctxs.length - 1; i >= 0; i--) { - const ctx = ctxs[i]; - if (ctx.has(name)) { - if (ctx.get(name) !== type) { - // clear the type if it changed in a higher context - ctx.delete(name); - } - } - } - this.getCurrentTypeCtx().set(name, type); - } - - /** - * @param {string} name - * @returns {number|undefined} - */ - getVariableType (name) { - const ctxs = this.typeCtxs; - for (let i = ctxs.length - 1; i >= 0; i--) { - const ctx = ctxs[i]; - if (ctx.has(name)) { - return ctx.get(name); - } - } - } } // For extensions. JSGenerator.unstable_exports = { - TYPES, - TYPE_NUMBER: TYPES.NUMBER, - TYPE_STRING: TYPES.STRING, - TYPE_BOOLEAN: TYPES.BOOLEAN, - TYPE_NUMBER_NAN: TYPES.NUMBER_NAN, - TYPE_UNKNOWN: TYPES.UNKNOWN, - TYPE_JSON: TYPES.JSON, - BLOCKS, factoryNameVariablePool, functionNameVariablePool, generatorNameVariablePool, VariablePool, PEN_EXT, PEN_STATE, - TypedInput, - ConstantInput, - VariableInput, Frame, sanitize }; -/** - * @type {{ report: (generator: JSGenerator, factory: string) => void } | null} - * Test hook used by automated snapshot testing. - */ +// Test hook used by automated snapshot testing. JSGenerator.testingApparatus = null; module.exports = JSGenerator; diff --git a/src/compiler/mists-utils.js b/src/compiler/mists-utils.js new file mode 100644 index 00000000000..a4a4eeaa6a2 --- /dev/null +++ b/src/compiler/mists-utils.js @@ -0,0 +1,69 @@ +const c = (type, compile) => Object.freeze({type, compile}); + +const mistsUtils = Object.freeze({ + notequals: c('boolean', ({input: i}) => `(${i.string('A')} !== ${i.string('B')})`), + equals: c('boolean', ({input: i}) => `(${i.string('A')} === ${i.string('B')})`), + greaterorequal: c('boolean', ({input: i}) => `(${i.number('A')} >= ${i.number('B')})`), + lessthanorequal: c('boolean', ({input: i}) => `(${i.number('A')} <= ${i.number('B')})`), + compare: c('boolean', ({input: i}) => `(${i.number('A')} ${i.raw('C')} ${i.number('B')})`), + power: c('number', ({input: i}) => `Math.pow(${i.number('A')}, ${i.number('B')})`), + round: c('number', ({input: i}) => `(Math.round(${i.number('A')} / ${i.number('B')}) * ${i.number('B')})`), + clamp: c('number', ({input: i}) => `Math.min(Math.max(${i.number('A')}, ${i.number('B')}), ${i.number('C')})`), + min: c('number', ({input: i}) => `Math.min(${i.number('A')}, ${i.number('B')})`), + max: c('number', ({input: i}) => `Math.max(${i.number('A')}, ${i.number('B')})`), + interpolate: c('number', ({input: i}) => + `(${i.number('B')} + ((${i.number('C')} - ${i.number('B')}) / ${i.number('A')}))`), + ifthen: c('string', ({input: i}) => `(${i.boolean('A')} ? ${i.string('B')} : ${i.string('C')})`), + letters: c('string', ({input: i}) => + `(${i.string('C')}).substring(Math.max(0, ${i.number('A')} - 1), ` + + `Math.min(${i.number('B')}, (${i.string('C')}).length))`), + starts: c('boolean', ({input: i}) => `(${i.string('A')}).startsWith(${i.string('B')})`), + ends: c('boolean', ({input: i}) => `(${i.string('A')}).endsWith(${i.string('B')})`), + toUnicode: c('number', ({input: i}) => `(${i.string('A')}).charCodeAt(0)`), + replace: c('string', ({input: i}) => `(${i.string('A')}).replace(${i.string('C')}, ${i.string('B')})`), + replaceall: c('string', ({input: i}) => `(${i.string('A')}).replaceAll(${i.string('C')}, ${i.string('B')})`), + alltextAfterString: c('string', ({input: i}) => + `(${i.string('A')}).substring((${i.string('A')}).indexOf(${i.string('B')}) + 1)`), + alltextBeforeString: c('string', ({input: i}) => `(${i.string('A')}).split(${i.string('B')}, 1)[0]`), + split: c('string', ({input: i}) => `JSON.stringify((${i.string('A')}).split(${i.string('B')}))`), + splitarray: c('any', ({input: i}) => `(${i.string('A')}).split(${i.string('B')})`), + length: c('number', ({input: i}) => `(${i('A')}).length`), + item: c('string', ({input: i}) => `(${i('A')}).split(${i.string('B')})[${i.number('C')}]`), + squarebrackets: c('any', ({input: i}) => `(${i('A')})[${i.string('B')}]`), + jsonparse: c('any', ({input: i}) => `JSON.parse(${i.string('A')})`), + jsonstringify: c('string', ({input: i}) => `JSON.stringify(${i('A')})`), + isnumber: c('boolean', ({input: i}) => `(Number(${i.string('A')}) == ${i.string('A')})`), + isstring: c('boolean', ({input: i}) => `(String(${i.string('A')}) == ${i.string('A')})`), + isboolean: c('boolean', ({input: i}) => `(${i.string('A')} == "true" || ${i.string('A')} == "false")`), + tostring: c('string', ({input: i}) => i.string('A')), + tonumber: c('number', ({input: i}) => `(isNaN(Number(${i.string('A')})) ? 0 : Number(${i.string('A')}))`), + toboolean: c('boolean', ({input: i}) => + `(${i.string('A')} == "true" || ${i.string('A')} == "1" || ${i.string('A')} == "yes")`), + true: c('boolean', () => 'true'), + false: c('boolean', () => 'false'), + isPackaged: c('boolean', () => `(typeof window.scaffolding === 'object')`), + performancenow: c('number', () => 'performance.now()'), + stagewidth: c('number', ({runtime}) => `${runtime}.stageWidth`), + stageheight: c('number', ({runtime}) => `${runtime}.stageHeight`), + newline: c('string', () => '"\\n"'), + pi: c('number', () => 'Math.PI'), + e: c('number', () => 'Math.E'), + infinity: c('number', () => 'Infinity'), + MaxInt: c('number', () => 'Number.MAX_SAFE_INTEGER') +}); + +const variadic = (name, input, mutation) => { + const count = Math.max(2, parseInt(mutation.itemcount, 10) || 2); + return `Math.${name}(${Array.from({length: count}, (_, index) => input.number(`NUM${index + 1}`)).join(',')})`; +}; + +const core = Object.freeze({ + sensing_stagewidth: c('number', ({runtime}) => `${runtime}.stageWidth`), + sensing_stageheight: c('number', ({runtime}) => `${runtime}.stageHeight`), + operator_clamp: c('number', ({input: i}) => + `Math.min(Math.max(${i.number('NUM')}, ${i.number('MIN')}), ${i.number('MAX')})`), + operator_min: c('number', ({input, mutation}) => variadic('min', input, mutation)), + operator_max: c('number', ({input, mutation}) => variadic('max', input, mutation)) +}); + +module.exports = {mistsUtils, core}; diff --git a/src/compiler/old-compiler-compatibility.js b/src/compiler/old-compiler-compatibility.js new file mode 100644 index 00000000000..230b86a9cd5 --- /dev/null +++ b/src/compiler/old-compiler-compatibility.js @@ -0,0 +1,371 @@ +/** + * @fileoverview + * Reimplements a subset of the old (pre-September 2025) compiler + * to maintain compatibility with extensions patching the old compiler. + * + * Safety and compatibility is more important than performance. There may be + * unnecessary type casts and scripts may be marked as yielding even when they + * don't actually yield. Additionally, anything running in this compatibility layer + * is not expected to receive the performance benefits of the new compiler. + * + * These assumptions are made about extensions using this compatibility layer: + * - Extensions do not try to combine this compatibility layer with any APIs + * provided by the new compiler. + * - Extensions treat IR nodes received from descendSubstack and similar as + * opaque objects. + * - Extensions need to implement the JS generators for all AST node kinds + * they use. Can not rely on the default JS generator. + */ + +const {InputOpcode, InputType} = require('./enums'); +// eslint-disable-next-line no-unused-vars +const {IntermediateInput, IntermediateStackBlock, IntermediateStack} = require('./intermediate'); + +class IRGeneratorStub { + // Doesn't seem like extensions override anything, though the class may + // still need to exist to avoid type errors. +} + +class ScriptTreeGeneratorStub { + /** + * @param {import("./irgen").ScriptTreeGenerator} real + */ + constructor (real) { + /** + * @type {import("./irgen").ScriptTreeGenerator} + */ + this.real = real; + + this.fakeThis = { + thread: real.thread, + target: real.target, + blocks: real.blocks, + runtime: real.runtime, + stage: real.stage, + script: real.script, + + /** + * @param parentBlock Parent VM block. + * @param {string} inputName Name of input. + * @returns opaque object + */ + descendInputOfBlock (parentBlock, inputName) { + const node = real.descendInputOfBlock(parentBlock, inputName, true); + return node; + }, + + /** + * @param {*} parentBlock Parent VM block. + * @param {*} substackName Name of substack. + * @returns opaque object + */ + descendSubstack (parentBlock, substackName) { + const substack = real.descendSubstack(parentBlock, substackName); + return substack; + }, + + analyzeLoop () { + // TODO: not always necessary + real.script.yields = true; + } + }; + } + + /** + * Intended for extensions to override. + * Always call from `fakeThis` context. + * @param {{opcode: string}} block VM block + * @returns {{kind: string}} Node object from old compiler. + */ + descendInput (block) { // eslint-disable-line no-unused-vars + return null; + } + + /** + * Intended for extensions to override. + * Always call from `fakeThis` context. + * @param {{opcode: string}} block VM block + * @returns {{kind: string}} Node object from old compiler. + */ + descendStackedBlock (block) { // eslint-disable-line no-unused-vars + return null; + } + + /** + * @param block VM block + * @returns {IntermediateInput|null} + */ + descendInputFromNewCompiler (block) { + const node = this.descendInput.call(this.fakeThis, block); + if (node) { + return new IntermediateInput(InputOpcode.OLD_COMPILER_COMPATIBILITY_LAYER, InputType.ANY, { + oldNode: node + }, true); + } + return null; + } + + /** + * @param block VM block + * @returns {IntermediateStackBlock|null} + */ + descendStackedBlockFromNewCompiler (block) { + const node = this.descendStackedBlock.call(this.fakeThis, block); + if (node) { + return new IntermediateStackBlock(InputOpcode.OLD_COMPILER_COMPATIBILITY_LAYER, { + oldNode: node + }, true); + } + return null; + } +} + +// These are part of the old compiler's API. +const TYPE_NUMBER = 1; +const TYPE_STRING = 2; +const TYPE_BOOLEAN = 3; +const TYPE_UNKNOWN = 4; +const TYPE_NUMBER_NAN = 5; + +/** + * Part of the old compiler's API. + */ +class TypedInput { + /** + * @param {string} source JavaScript + * @param {number|IntermediateInput} typeOrIntermediate + */ + constructor (source, typeOrIntermediate) { + /** + * JavaScript. + * @type {string} + */ + this.source = source; + + if (typeOrIntermediate instanceof IntermediateInput) { + // Path used by the compatibility layer itself + + /** + * @type {IntermediateInput} + */ + this.intermediate = typeOrIntermediate; + + /** + * @type {number} See TYPE_* constants above + */ + this.type = TYPE_UNKNOWN; + } else { + // Path used by extensions + this.intermediate = null; + this.type = typeOrIntermediate; + } + } + + asNumber () { + return `(+${this.source} || 0)`; + } + + asNumberOrNaN () { + return `(+${this.source})`; + } + + asString () { + return `("" + ${this.source})`; + } + + asBoolean () { + return `toBoolean(${this.source})`; + } + + asColor () { + return this.asUnknown(); + } + + asUnknown () { + return this.source; + } + + asSafe () { + return this.asUnknown(); + } + + isAlwaysNumber () { + // TODO + return false; + } + + isAlwaysNumberOrNaN () { + // TODO + return false; + } + + isNeverNumber () { + // TODO + return false; + } +} + +class ConstantInput extends TypedInput { + constructor (constantValue, safe) { + super(typeof constantValue === 'string' ? JSON.stringify(constantValue) : `${constantValue}`, TYPE_UNKNOWN); + this.constantValue = constantValue; + this.safe = safe; + } +} + +class VariableInput extends TypedInput { + constructor (source) { + super(source, TYPE_UNKNOWN); + } +} + +const sanitize = value => JSON.stringify(`${value}`).slice(1, -1); + +/** + * Part of the old compiler's API. + */ +class VariablePool { + constructor (prefix) { + this.prefix = prefix; + this.count = 0; + } + + next () { + return `${this.prefix}${this.count++}`; + } +} + +/** + * Part of the old compiler's API. + */ +class Frame { + constructor (isLoop) { + this.isLoop = isLoop; + this.isLastBlock = false; + } +} + +class JSGeneratorStub { + /** + * @param {import("./jsgen")} real + */ + constructor (real) { + /** + * @type {import("./jsgen")} + */ + this.real = real; + + this.fakeThis = { + script: real.script, + ir: real.ir, + target: real.target, + + get frames () { + return real.frames; + }, + get currentFrame () { + return real.currentFrame; + }, + + get source () { + return real.source; + }, + set source (newSource) { + real.source = newSource; + }, + + localVariables: new VariablePool('oldCompilerLocal'), + + /** + * @param {IntermediateInput} intermediate + * @returns {void} output is concatenated in this.source + */ + descendInput (intermediate) { + if (intermediate.opcode === InputOpcode.CONSTANT) { + return new ConstantInput(intermediate.inputs.value, true); + } + const js = real.descendInput(intermediate); + return new TypedInput(js, intermediate); + }, + + /** + * @param {IntermediateStack} stack Stack of blocks. + * @param {Frame} frame New frame + */ + descendStack (stack, frame) { + real.descendStack(stack, frame); + }, + + yieldLoop: () => real.yieldLoop(), + yieldNotWarp: () => real.yieldNotWarp(), + yieldStuckOrNotWarp: () => real.yieldStuckOrNotWarp(), + yielded: () => real.yielded(), + requestRedraw: () => real.requestRedraw() + }; + } + + /** + * Intended for extensions to override. + * Always call from `fakeThis` context. + * @param {{kind: string}} node Old compiler AST node. + * @returns {TypedInput} Old compiler TypedInput. + */ + descendInput (node) { + throw new Error(`Unknown input: ${node.kind}`); + } + + /** + * Intended for extensions to override. + * Always call from `fakeThis` context. + * @param {{kind: string}} node Old compiler AST node. + */ + descendStackedBlock (node) { + throw new Error(`Unknown stacked block: ${node.kind}`); + } + + /** + * @param {IntermediateInput} intermediate + * @returns {string} JavaScript + */ + descendInputFromNewCompiler (intermediate) { + const oldNode = intermediate.inputs.oldNode; + const typedInput = this.descendInput.call(this.fakeThis, oldNode); + return typedInput.asSafe(); + } + + /** + * @param {IntermediateStackBlock} intermediate + * @returns {void} source property on real JSGenerator is modified directly + */ + descendStackedBlockFromNewCompiler (intermediate) { + const oldNode = intermediate.inputs.oldNode; + this.descendStackedBlock.call(this.fakeThis, oldNode); + } +} + +/** + * Part of old compiler's API. + */ +JSGeneratorStub.unstable_exports = { + TYPE_NUMBER, + TYPE_STRING, + TYPE_BOOLEAN, + TYPE_UNKNOWN, + TYPE_NUMBER_NAN, + VariablePool, + TypedInput, + ConstantInput, + VariableInput, + Frame, + sanitize +}; + +const oldCompilerCompatibility = { + enabled: false, + IRGeneratorStub, + ScriptTreeGeneratorStub, + TypedInput, + JSGeneratorStub +}; + +module.exports = oldCompilerCompatibility; diff --git a/src/compiler/shared.js b/src/compiler/shared.js deleted file mode 100644 index 3cc2b29279b..00000000000 --- a/src/compiler/shared.js +++ /dev/null @@ -1,58 +0,0 @@ -const log = require('../util/log'); - -/** - * @param {string} string - * @returns {string} - */ -const sanitize = string => { - if (typeof string !== 'string') { - log.warn(`sanitize got unexpected type: ${typeof string}`); - string = `${string}`; - } - return JSON.stringify(string).slice(1, -1); -}; - -/** - * @param {Input} input - * @returns {boolean} - */ -const isSafeConstantForEqualsOptimization = input => { - if (typeof input.constantValue === 'undefined') return false; - - const numberValue = +input.constantValue; - // Do not optimize 0 (+"" === 0 would be true) - if (!numberValue) { - return false; - } - // Do not optimize numbers when the original form does not match - return numberValue.toString() === input.constantValue.toString(); -}; - -/** - * @param {import('../engine/runtime')} runtime - * @returns {Set} - */ -const getNamesOfCostumesAndSounds = runtime => { - const result = new Set(); - for (const target of runtime.targets) { - if (target.isOriginal) { - const sprite = target.sprite; - for (const costume of sprite.costumes) { - result.add(costume.name); - } - for (const sound of sprite.sounds) { - result.add(sound.name); - } - } - } - return result; -}; - -const toNotNaN = value => (Number.isNaN(value) ? 0 : value); - -module.exports = { - sanitize, - isSafeConstantForEqualsOptimization, - getNamesOfCostumesAndSounds, - toNotNaN -}; diff --git a/src/compiler/variable-pool.js b/src/compiler/variable-pool.js index 11f50594021..47f463e97b3 100644 --- a/src/compiler/variable-pool.js +++ b/src/compiler/variable-pool.js @@ -1,3 +1,5 @@ +// @ts-check + class VariablePool { /** * @param {string} prefix The prefix at the start of the variable name. diff --git a/src/engine/blocks.js b/src/engine/blocks.js index 291c6e3d186..aa89bdabb14 100644 --- a/src/engine/blocks.js +++ b/src/engine/blocks.js @@ -3,7 +3,6 @@ const mutationAdapter = require('./mutation-adapter'); const xmlEscape = require('../util/xml-escape'); const MonitorRecord = require('./monitor-record'); const Clone = require('../util/clone'); -const {Map} = require('immutable'); const BlocksExecuteCache = require('./blocks-execute-cache'); const BlocksRuntimeCache = require('./blocks-runtime-cache'); const log = require('../util/log'); @@ -773,10 +772,10 @@ class Blocks { const flyoutBlock = block.shadow && block.parent ? this._blocks[block.parent] : block; if (flyoutBlock.isMonitored) { - this.runtime.requestUpdateMonitor(Map({ + this.runtime.requestUpdateMonitor({ id: flyoutBlock.id, params: this._getBlockParams(flyoutBlock) - })); + }); } } break; @@ -784,6 +783,9 @@ class Blocks { block.mutation = mutationAdapter(args.value); break; case 'checkbox': { + const stage = this.runtime.getTargetForStage(); + if (!stage) return; + // A checkbox usually has a one to one correspondence with the monitor // block but in the case of monitored reporters that have arguments, // map the old id to a new id, creating a new monitor block if necessary @@ -813,9 +815,9 @@ class Blocks { // Variable blocks may be sprite specific depending on the owner of the variable let isSpriteLocalVariable = false; if (block.opcode === 'data_variable') { - isSpriteLocalVariable = !(this.runtime.getTargetForStage().variables[block.fields.VARIABLE.id]); + isSpriteLocalVariable = !(stage.variables[block.fields.VARIABLE.id]); } else if (block.opcode === 'data_listcontents') { - isSpriteLocalVariable = !(this.runtime.getTargetForStage().variables[block.fields.LIST.id]); + isSpriteLocalVariable = !(stage.variables[block.fields.LIST.id]); } const isSpriteSpecific = isSpriteLocalVariable || @@ -835,7 +837,7 @@ class Blocks { } else if (!wasMonitored && block.isMonitored) { // Tries to show the monitor for specified block. If it doesn't exist, add the monitor. if (!this.runtime.requestShowMonitor(block.id)) { - this.runtime.requestAddMonitor(MonitorRecord({ + this.runtime.requestAddMonitor(new MonitorRecord({ id: block.id, targetId: block.targetId, spriteName: block.targetId ? this.runtime.getTargetById(block.targetId).getName() : null, diff --git a/src/engine/execute.js b/src/engine/execute.js index 8cb192f0938..c9f2f115e06 100644 --- a/src/engine/execute.js +++ b/src/engine/execute.js @@ -2,7 +2,6 @@ const BlockUtility = require('./block-utility'); const BlocksExecuteCache = require('./blocks-execute-cache'); const log = require('../util/log'); const Thread = require('./thread'); -const {Map} = require('immutable'); const cast = require('../util/cast'); /** @@ -92,7 +91,7 @@ const handleReport = function (resolvedValue, sequencer, thread, blockCached, la // at the top of the thread stack. if (lastOperation && typeof resolvedValue !== 'undefined' && thread.atStackTop()) { if (thread.stackClick) { - sequencer.runtime.visualReport(currentBlockId, resolvedValue); + sequencer.runtime.visualReport(thread.target, currentBlockId, resolvedValue); } if (thread.updateMonitor) { const targetId = sequencer.runtime.monitorBlocks.getBlock(currentBlockId).targetId; @@ -100,11 +99,11 @@ const handleReport = function (resolvedValue, sequencer, thread, blockCached, la // Target no longer exists return; } - sequencer.runtime.requestUpdateMonitor(Map({ + sequencer.runtime.requestUpdateMonitor({ id: currentBlockId, spriteName: targetId ? sequencer.runtime.getTargetById(targetId).getName() : null, value: resolvedValue - })); + }); } } // Finished any yields. diff --git a/src/engine/monitor-record.js b/src/engine/monitor-record.js index 1259d525290..f19e7be10ec 100644 --- a/src/engine/monitor-record.js +++ b/src/engine/monitor-record.js @@ -1,23 +1,202 @@ -const {Record} = require('immutable'); - -const MonitorRecord = Record({ - id: null, // Block Id - /** Present only if the monitor is sprite-specific, such as x position */ - spriteName: null, - /** Present only if the monitor is sprite-specific, such as x position */ - targetId: null, - opcode: null, - value: null, - params: null, - mode: 'default', - sliderMin: 0, - sliderMax: 100, - isDiscrete: true, - x: null, // (x: null, y: null) Indicates that the monitor should be auto-positioned - y: null, - width: 0, - height: 0, - visible: true -}); +/** + * @param {unknown} obj + * @returns {boolean} + */ +const defined = obj => typeof obj !== 'undefined' && obj !== null; + +/** + * @typedef JSDelta Delta object using regular JS object. + * @property {string|null} [id] + * @property {string|null} [spriteName] + * @property {string|null} [targetId] + * @property {string|null} [opcode] + * @property {unknown} [value] + * @property {unknown} [params] + * @property {string|null} [mode] + * @property {number|null} [sliderMin] + * @property {number|null} [sliderMax] + * @property {boolean|null} [isDiscrete] + * @property {number|null} [x] + * @property {number|null} [y] + * @property {number|null} [width] + * @property {number|null} [height] + * @property {boolean|null} [visible] + */ + +/** + * @typedef ImmutableJSDelta Delta object that is an immutable.js Map/OrderedMap. + * @property {() => JSDelta} toJS + */ + +/** + * @typedef {JSDelta|ImmutableJSDelta|Map} ExternalDelta Delta object that might be JS object, immutable.js, or JS Map + */ + +/** + * @implements {JSDelta} + */ +class MonitorRecord { + /** + * @param {JSDelta} delta + */ + constructor (delta) { + /** + * Block ID + */ + this.id = delta.id ?? null; + /** + * Present only if the monitor is sprite-specific, such as x position + */ + this.spriteName = delta.spriteName ?? null; + /** + * Present only if the monitor is sprite-specific, such as x position + */ + this.targetId = delta.targetId ?? null; + this.opcode = delta.opcode ?? null; + this.value = delta.value ?? null; + this.params = delta.params ?? null; + this.mode = delta.mode ?? 'default'; + this.sliderMin = delta.sliderMin ?? 0; + this.sliderMax = delta.sliderMax ?? 100; + this.isDiscrete = delta.isDiscrete ?? true; + /** + * (x: null, y: null) Indicates that the monitor should be auto-positioned + */ + this.x = delta.x ?? null; + /** + * (x: null, y: null) Indicates that the monitor should be auto-positioned + */ + this.y = delta.y ?? null; + this.width = delta.width ?? 0; + this.height = delta.height ?? 0; + this.visible = delta.visible ?? true; + } + + /** + * Exists for compatibility with code expecting an immutable.js Map + * @param {string} property + */ + get (property) { + switch (property) { + case 'id': return this.id; + case 'spriteName': return this.spriteName; + case 'targetId': return this.targetId; + case 'opcode': return this.opcode; + case 'value': return this.value; + case 'params': return this.params; + case 'mode': return this.mode; + case 'sliderMin': return this.sliderMin; + case 'sliderMax': return this.sliderMax; + case 'isDiscrete': return this.isDiscrete; + case 'x': return this.x; + case 'y': return this.y; + case 'width': return this.width; + case 'height': return this.height; + case 'visible': return this.visible; + } + return null; + } + + /** + * @param {JSDelta} delta + * @returns {boolean} true if modified + */ + merge (delta) { + let didChange = false; + + if (defined(delta.id) && !Object.is(this.id, delta.id)) { + this.id = delta.id; + didChange = true; + } + + if (defined(delta.spriteName) && !Object.is(this.spriteName, delta.spriteName)) { + this.spriteName = delta.spriteName; + didChange = true; + } + + if (defined(delta.targetId) && !Object.is(this.targetId, delta.targetId)) { + this.targetId = delta.targetId; + didChange = true; + } + + if (defined(delta.opcode) && !Object.is(this.opcode, delta.opcode)) { + this.opcode = delta.opcode; + didChange = true; + } + + if (defined(delta.value) && !Object.is(this.value, delta.value)) { + this.value = delta.value; + didChange = true; + } + + if (defined(delta.params) && !Object.is(this.params, delta.params)) { + this.params = delta.params; + didChange = true; + } + + if (defined(delta.mode) && !Object.is(this.mode, delta.mode)) { + this.mode = delta.mode; + didChange = true; + } + + if (defined(delta.sliderMin) && !Object.is(this.sliderMin, delta.sliderMin)) { + this.sliderMin = delta.sliderMin; + didChange = true; + } + + if (defined(delta.sliderMax) && !Object.is(this.sliderMax, delta.sliderMax)) { + this.sliderMax = delta.sliderMax; + didChange = true; + } + + if (defined(delta.isDiscrete) && !Object.is(this.isDiscrete, delta.isDiscrete)) { + this.isDiscrete = delta.isDiscrete; + didChange = true; + } + + if (defined(delta.x) && !Object.is(this.x, delta.x)) { + this.x = delta.x; + didChange = true; + } + + if (defined(delta.y) && !Object.is(this.y, delta.y)) { + this.y = delta.y; + didChange = true; + } + + if (defined(delta.width) && !Object.is(this.width, delta.width)) { + this.width = delta.width; + didChange = true; + } + + if (defined(delta.height) && !Object.is(this.height, delta.height)) { + this.height = delta.height; + didChange = true; + } + + if (defined(delta.visible) && !Object.is(this.visible, delta.visible)) { + this.visible = delta.visible; + didChange = true; + } + + return didChange; + } +} + +/** + * For compatibility, converts delta received from consumer to a plain JS delta for internal use. + * @param {ExternalDelta} obj + * @returns {JSDelta} + */ +MonitorRecord.externalDeltaToJS = obj => { + if (typeof obj.toJS === 'function') { + return obj.toJS(); + } + // Nothing in Scratch would pass a JS map into this, but some weird extensions do. + if (obj instanceof Map) { + return Object.fromEntries(Array.from(obj.entries())); + } + return obj; +}; module.exports = MonitorRecord; diff --git a/src/engine/runtime.js b/src/engine/runtime.js index 4efe30a6af9..065ca31edf3 100644 --- a/src/engine/runtime.js +++ b/src/engine/runtime.js @@ -1,5 +1,4 @@ const EventEmitter = require('events'); -const {OrderedMap} = require('immutable'); const ExtendedJSON = require('@turbowarp/json'); const uuid = require('uuid'); @@ -11,6 +10,7 @@ const Profiler = require('./profiler'); const Sequencer = require('./sequencer'); const execute = require('./execute.js'); const compilerExecute = require('../compiler/jsexecute'); +const {mistsUtils: mistsUtilsCompiler, core: mistWarpCompiler} = require('../compiler/mists-utils'); const ScratchBlocksConstants = require('./scratch-blocks-constants'); const TargetType = require('../extension-support/target-type'); const Thread = require('./thread'); @@ -24,6 +24,8 @@ const FontManager = require('./tw-font-manager'); const AssetManager = require('./mw-asset-manager'); const fetchWithTimeout = require('../util/fetch-with-timeout'); const platform = require('./tw-platform.js'); +const safeStringify = require('../util/tw-safe-stringify.js'); +const MonitorState = require('./tw-monitor-state.js'); // Virtual I/O devices. const Clock = require('../io/clock'); @@ -52,6 +54,7 @@ const defaultBlockPackages = { const interpolate = require('./tw-interpolate'); const FrameLoop = require('./tw-frame-loop'); +const MonitorRecord = require('./monitor-record.js'); const defaultExtensionColors = ['#0FBD8C', '#0DA57A', '#0B8E69']; @@ -315,14 +318,9 @@ class Runtime extends EventEmitter { this.monitorBlockInfo = {}; /** - * Ordered map of all monitors, which are MonitorReporter objects. + * Ordered map of all monitors, which are MonitorRecord objects. */ - this._monitorState = OrderedMap({}); - - /** - * Monitor state from last tick - */ - this._prevMonitorState = OrderedMap({}); + this._monitorState = new MonitorState(); /** * Whether the project is in "turbo mode." @@ -473,6 +471,15 @@ class Runtime extends EventEmitter { warpTimer: false }; + // Compiler implementations registered by unsandboxed extensions. + this.compilerExtensions = new Map(); + for (const [opcode, compiler] of Object.entries(mistsUtilsCompiler)) { + this.compilerExtensions.set(`mistsutils_${opcode}`, compiler); + } + for (const [opcode, compiler] of Object.entries(mistWarpCompiler)) { + this.compilerExtensions.set(opcode, compiler); + } + this.debug = false; this.interpolationEnabled = false; @@ -515,6 +522,12 @@ class Runtime extends EventEmitter { */ this.enforcePrivacy = true; + /** + * If true, an external communication method exists and enforcePrivacy is enabled. + * Do not update this directly. Must be changed via public functions that call Runtime.updatePrivacy(). + */ + this.privacyRestrictionsActive = false; + /** * Internal map of opaque identifiers to the callback to run that function. * @type {Map} @@ -1532,7 +1545,7 @@ class Runtime extends EventEmitter { if (blockInfo.blockShape) { blockJSON.outputShape = blockInfo.blockShape; } - + const blockText = Array.isArray(blockInfo.text) ? blockInfo.text : [blockInfo.text]; let inTextNum = 0; // text for the next block "arm" is blockText[inTextNum] let inBranchNum = 0; // how many branches have we placed into the JSON so far? @@ -2210,7 +2223,11 @@ class Runtime extends EventEmitter { // Remove any existing thread. for (let i = 0; i < this.threads.length; i++) { // Toggling a script that's already running turns it off - if (this.threads[i].topBlock === topBlockId && this.threads[i].status !== Thread.STATUS_DONE) { + if ( + this.threads[i].target === opts.target && + this.threads[i].topBlock === topBlockId && + this.threads[i].status !== Thread.STATUS_DONE + ) { const blockContainer = opts.target.blocks; const opcode = blockContainer.getOpcode(blockContainer.getBlock(topBlockId)); @@ -2386,10 +2403,9 @@ class Runtime extends EventEmitter { this.targets.map(this.disposeTarget, this); this.extensionStorage = {}; // tw: explicitly emit a MONITORS_UPDATE instead of relying on implicit behavior of _step() - const emptyMonitorState = OrderedMap({}); - if (!emptyMonitorState.equals(this._monitorState)) { - this._monitorState = emptyMonitorState; - this.emit(Runtime.MONITORS_UPDATE, this._monitorState); + if (!this._monitorState.empty()) { + this._monitorState = new MonitorState(); + this.emit(Runtime.MONITORS_UPDATE, this._monitorState.shallowClone()); } this.emit(Runtime.RUNTIME_DISPOSED); this.ioDevices.clock.resetProjectTimer(); @@ -2662,9 +2678,9 @@ class Runtime extends EventEmitter { this._refreshTargets = false; } - if (!this._prevMonitorState.equals(this._monitorState)) { - this.emit(Runtime.MONITORS_UPDATE, this._monitorState); - this._prevMonitorState = this._monitorState; + if (this._monitorState.dirty) { + this.emit(Runtime.MONITORS_UPDATE, this._monitorState.shallowClone()); + this._monitorState.dirty = false; } if (this.profiler !== null) { @@ -2691,6 +2707,10 @@ class Runtime extends EventEmitter { * Queue monitor blocks to sequencer to be run. */ _pushMonitors () { + if (this.targets.length === 0) { + // Project is not loaded yet, but monitors might be. Don't try to start anything. + return; + } this.monitorBlocks.runAllMonitored(this); } @@ -2788,12 +2808,13 @@ class Runtime extends EventEmitter { const offsetX = deltaX / 2; const offsetY = deltaY / 2; for (const monitor of this._monitorState.valueSeq()) { - const newMonitor = monitor - .set('x', monitor.get('x') + offsetX) - .set('y', monitor.get('y') + offsetY); - this.requestUpdateMonitor(newMonitor); + this.requestUpdateMonitor({ + id: monitor.id, + x: monitor.get('x') + offsetX, + y: monitor.get('y') + offsetY + }); } - this.emit(Runtime.MONITORS_UPDATE, this._monitorState); + this.emit(Runtime.MONITORS_UPDATE, this._monitorState.shallowClone()); } this.stageWidth = width; @@ -3178,53 +3199,49 @@ class Runtime extends EventEmitter { /** * Emit value for reporter to show in the blocks. + * @param {Target} target The target that the block was run in. * @param {string} blockId ID for the block. * @param {string} value Value to show associated with the block. */ - visualReport (blockId, value) { - if (typeof value === 'object') { - value = JSON.stringify(value); - } - if (typeof value === 'undefined') { - value = 'undefined'; - } - if (value.length > 10000) { - value = `${value.substr(0, 10000)}...`; + visualReport (target, blockId, value) { + // Extensions using the legacy compiler API generated two-argument calls. + if (arguments.length === 2) { + value = blockId; + blockId = target; + target = this.getEditingTarget(); + } + if (target === this.getEditingTarget()) { + this.emit(Runtime.VISUAL_REPORT, { + id: blockId, + value: safeStringify(value) + }); } - this.emit(Runtime.VISUAL_REPORT, {id: blockId, value: value}); } /** * Add a monitor to the state. If the monitor already exists in the state, * updates those properties that are defined in the given monitor record. - * @param {!MonitorRecord} monitor Monitor to add. + * @param {import('./monitor-record.js')} monitor Monitor to add. */ requestAddMonitor (monitor) { - const id = monitor.get('id'); if (!this.requestUpdateMonitor(monitor)) { // update monitor if it exists in the state // if the monitor did not exist in the state, add it - this._monitorState = this._monitorState.set(id, monitor); + this._monitorState.set(monitor.id, monitor); } } /** * Update a monitor in the state and report success/failure of update. - * @param {!Map} monitor Monitor values to update. Values on the monitor with overwrite - * values on the old monitor with the same ID. If a value isn't defined on the new monitor, + * @param {import('./monitor-record.js').ExternalDelta} delta Monitor values to update. Values on the monitor will + * overwrite values on the old monitor with the same ID. If a value isn't defined on the new monitor, * the old monitor will keep its old value. * @return {boolean} true if monitor exists in the state and was updated, false if it did not exist. */ - requestUpdateMonitor (monitor) { - const id = monitor.get('id'); + requestUpdateMonitor (delta) { + delta = MonitorRecord.externalDeltaToJS(delta); + const id = delta.id; if (this._monitorState.has(id)) { - this._monitorState = - // Use mergeWith here to prevent undefined values from overwriting existing ones - this._monitorState.set(id, this._monitorState.get(id).mergeWith((prev, next) => { - if (typeof next === 'undefined' || next === null) { - return prev; - } - return next; - }, monitor)); + this._monitorState.set(id, delta); return true; } return false; @@ -3236,7 +3253,7 @@ class Runtime extends EventEmitter { * @param {!string} monitorId ID of the monitor to remove. */ requestRemoveMonitor (monitorId) { - this._monitorState = this._monitorState.delete(monitorId); + this._monitorState.delete(monitorId); } /** @@ -3245,10 +3262,10 @@ class Runtime extends EventEmitter { * @return {boolean} true if monitor exists and was updated, false otherwise */ requestHideMonitor (monitorId) { - return this.requestUpdateMonitor(new Map([ - ['id', monitorId], - ['visible', false] - ])); + return this.requestUpdateMonitor({ + id: monitorId, + visible: false + }); } /** @@ -3258,10 +3275,10 @@ class Runtime extends EventEmitter { * @return {boolean} true if monitor exists and was updated, false otherwise */ requestShowMonitor (monitorId) { - return this.requestUpdateMonitor(new Map([ - ['id', monitorId], - ['visible', true] - ])); + return this.requestUpdateMonitor({ + id: monitorId, + visible: true + }); } /** @@ -3270,7 +3287,7 @@ class Runtime extends EventEmitter { * @param {!string} targetId Remove all monitors with given target ID. */ requestRemoveMonitorByTargetId (targetId) { - this._monitorState = this._monitorState.filterNot(value => value.targetId === targetId); + this._monitorState.filter(value => value.targetId !== targetId); } /** @@ -3533,12 +3550,12 @@ class Runtime extends EventEmitter { } updatePrivacy () { - const enforceRestrictions = ( + this.privacyRestrictionsActive = ( this.enforcePrivacy && Object.values(this.externalCommunicationMethods).some(i => i) ); if (this.renderer && this.renderer.setPrivateSkinAccess) { - this.renderer.setPrivateSkinAccess(!enforceRestrictions); + this.renderer.setPrivateSkinAccess(!this.privacyRestrictionsActive); } } diff --git a/src/engine/sequencer.js b/src/engine/sequencer.js index b493694d066..4ff71ce0c2c 100644 --- a/src/engine/sequencer.js +++ b/src/engine/sequencer.js @@ -200,6 +200,7 @@ class Sequencer { } // Save the current block ID to notice if we did control flow. while ((currentBlockId = thread.peekStack())) { + const initialStackSize = thread.stack.length; let isWarpMode = thread.peekStackFrame().warpMode; if (isWarpMode && !thread.warpTimer) { // Initialize warp-mode timer if it hasn't been already. @@ -245,7 +246,11 @@ class Sequencer { return; } // If no control flow has happened, switch to next block. - if (thread.peekStack() === currentBlockId && !thread.peekStackFrame().waitingReporter) { + if ( + thread.stack.length === initialStackSize && + thread.peekStack() === currentBlockId && + !thread.peekStackFrame().waitingReporter + ) { thread.goToNextBlock(); } // If no next block has been found at this point, look on the stack. diff --git a/src/engine/target.js b/src/engine/target.js index 9b23b97e602..075d2ea15d9 100644 --- a/src/engine/target.js +++ b/src/engine/target.js @@ -5,7 +5,6 @@ const Variable = require('../engine/variable'); const Comment = require('../engine/comment'); const Frame = require('../engine/frame'); const uid = require('../util/uid'); -const {Map} = require('immutable'); const log = require('../util/log'); const StringUtil = require('../util/string-util'); const VariableUtil = require('../util/variable-util'); @@ -377,10 +376,10 @@ class Target extends EventEmitter { }, this.runtime); const monitorBlock = blocks.getBlock(variable.id); if (monitorBlock) { - this.runtime.requestUpdateMonitor(Map({ + this.runtime.requestUpdateMonitor({ id: id, params: blocks._getBlockParams(monitorBlock) - })); + }); } } diff --git a/src/engine/tw-monitor-state.js b/src/engine/tw-monitor-state.js new file mode 100644 index 00000000000..caa3a90c7e1 --- /dev/null +++ b/src/engine/tw-monitor-state.js @@ -0,0 +1,123 @@ +/** + * @typedef {import('./monitor-record')} MonitorRecord + */ + +const MonitorRecord = require('./monitor-record'); +const {OrderedMap} = require('immutable'); + +class MonitorState { + constructor () { + /** + * @type {Map} + */ + this.map = new Map(); + + /** + * True if modified. + * @type {boolean} + */ + this.dirty = false; + } + + /** + * @param {string} id + * @returns {MonitorRecord|null} + */ + get (id) { + return this.map.get(id); + } + + /** + * @param {string} id + * @returns {boolean} + */ + has (id) { + return this.map.has(id); + } + + /** + * Create or update. + * @param {string} id + * @param {MonitorRecord.JSDelta} delta + */ + set (id, delta) { + if (this.map.has(id)) { + const oldRecord = this.map.get(id); + if (oldRecord.merge(delta)) { + this.dirty = true; + } + } else { + this.map.set(id, delta instanceof MonitorRecord ? delta : new MonitorRecord(delta)); + this.dirty = true; + } + } + + /** + * @param {string} id + */ + delete (id) { + if (this.map.has(id)) { + this.map.delete(id); + this.dirty = true; + } + } + + /** + * Removes monitors that do not satisfy callback. + * @param {(record: MonitorRecord) => boolean} callback Returns true to keep. + */ + filter (callback) { + for (const id of Array.from(this.map.keys())) { + const record = this.map.get(id); + if (!callback(record)) { + this.map.delete(id); + this.dirty = true; + } + } + } + + /** + * @returns {boolean} true if no monitors + */ + empty () { + return this.map.size === 0; + } + + /** + * @returns {number} + */ + get size () { + return this.map.size; + } + + /** + * @returns {MonitorRecord[]} + */ + values () { + return Array.from(this.map.values()); + } + + /** + * For compatibility with immutable.js. + * @returns {MonitorRecord[]} + */ + valueSeq () { + return this.values(); + } + + /** + * You should not perform write operations on the clone. + * @returns {MonitorState} + */ + shallowClone () { + const result = new MonitorState(); + result.map = this.map; + return result; + } + + toImmutable () { + return OrderedMap(this.map); + } +} + +module.exports = MonitorState; diff --git a/src/engine/variable.js b/src/engine/variable.js index 2cf45b50379..444b4647397 100644 --- a/src/engine/variable.js +++ b/src/engine/variable.js @@ -8,13 +8,14 @@ const xmlEscape = require('../util/xml-escape'); class Variable { /** - * @param {string} id Id of the variable. + * @param {string | null} id Id of the variable. * @param {string} name Name of the variable. * @param {string} type Type of the variable, one of '' or 'list' * @param {boolean} isCloud Whether the variable is stored in the cloud. * @constructor */ constructor (id, name, type, isCloud) { + /** @type {string} */ this.id = id || uid(); this.name = name; this.type = type; diff --git a/src/extension-support/extension-manager.js b/src/extension-support/extension-manager.js index e5f8759c9af..46d2ee7cea8 100644 --- a/src/extension-support/extension-manager.js +++ b/src/extension-support/extension-manager.js @@ -25,6 +25,7 @@ const defaultBuiltinExtensions = { makeymakey: () => require('../extensions/scratch3_makeymakey'), boost: () => require('../extensions/scratch3_boost'), gdxfor: () => require('../extensions/scratch3_gdx_for'), + patching: () => require('../extensions/mistwarp_patching'), // tw: core extension tw: () => require('../extensions/tw') }; diff --git a/src/extension-support/block-shape.js b/src/extension-support/tw-block-shape.js similarity index 100% rename from src/extension-support/block-shape.js rename to src/extension-support/tw-block-shape.js diff --git a/src/extension-support/tw-default-extension-urls.js b/src/extension-support/tw-default-extension-urls.js index 7b05eb80ccd..05411afc69b 100644 --- a/src/extension-support/tw-default-extension-urls.js +++ b/src/extension-support/tw-default-extension-urls.js @@ -1,15 +1,21 @@ // If a project uses an extension but does not specify a URL, it will default to // the URLs given here, if it exists. This is useful for compatibility with other mods. -const defaults = new Map(); +const defaults = { + // Box2D (`griffpatch`) is not listed here because our extension is not actually + // compatible with the original version due to fields vs inputs. -// Box2D (`griffpatch`) is not listed here because our extension is not actually -// compatible with the original version due to fields vs inputs. + // Scratch Lab Animated Text - https://lab.scratch.mit.edu/text/ + text: 'https://extensions.turbowarp.org/lab/text.js', -// Scratch Lab Animated Text - https://lab.scratch.mit.edu/text/ -defaults.set('text', 'https://extensions.turbowarp.org/lab/text.js'); + // Turboloader's AudioStream + audiostr: 'https://extensions.turbowarp.org/turboloader/audiostream.js', -// Turboloader's AudioStream -defaults.set('audiostr', 'https://extensions.turbowarp.org/turboloader/audiostream.js'); + // Face Sensing - https://lab.scratch.mit.edu/face/ - https://scratch.mit.edu/discuss/topic/842592/ + faceSensing: 'https://extensions.turbowarp.org/lab/face-sensing.js', + + // Video Sprites - https://lab.scratch.mit.edu/videosprites/ + videoSprites: 'https://extensions.turbowarp.org/lab/video-sprites.js' +}; module.exports = defaults; diff --git a/src/extension-support/tw-extension-api-common.js b/src/extension-support/tw-extension-api-common.js index 20503d56dcf..82e706de98f 100644 --- a/src/extension-support/tw-extension-api-common.js +++ b/src/extension-support/tw-extension-api-common.js @@ -1,15 +1,17 @@ const ArgumentType = require('./argument-type'); const BlockType = require('./block-type'); -const BlockShape = require('./block-shape'); +const BlockShape = require('./tw-block-shape'); const TargetType = require('./target-type'); const Cast = require('../util/cast'); +const external = require('./tw-external'); const Scratch = { ArgumentType, BlockType, BlockShape, TargetType, - Cast + Cast, + external }; module.exports = Scratch; diff --git a/src/extension-support/tw-external.js b/src/extension-support/tw-external.js new file mode 100644 index 00000000000..d4b5bf40028 --- /dev/null +++ b/src/extension-support/tw-external.js @@ -0,0 +1,87 @@ +/** + * @param {string} url + * @returns {void} if URL is supported + * @throws if URL is unsupported + */ +const checkURL = url => { + // URL might be a very long data: URL, so try to avoid fully parsing it if we can. + // The notable requirement here is that the URL must be an absolute URL, not something + // relative to where the extension is loaded from or where the extension is running. + // This ensures that the same extension file will always load resources from the same + // place, regardless of how it is running or packaged or whatever else. + if ( + !url.startsWith('http:') && + !url.startsWith('https:') && + !url.startsWith('data:') && + !url.startsWith('blob:') + ) { + throw new Error(`Unsupported URL: ${url}`); + } +}; + +const external = {}; + +/** + * @param {string} url + * @template T + * @returns {Promise} + */ +external.importModule = url => { + checkURL(url); + // Need to specify webpackIgnore so that webpack compiles this directly to a call to import() + // instead of trying making it try to use the webpack import system. + return import(/* webpackIgnore: true */ url); +}; + +/** + * @param {string} url + * @returns {Promise} + */ +external.fetch = async url => { + checkURL(url); + const res = await fetch(url); + if (!res.ok) { + throw new Error(`HTTP ${res.status} fetching ${url}`); + } + return res; +}; + +/** + * @param {string} url + * @returns {Promise} + */ +external.dataURL = async url => { + const res = await external.fetch(url); + const blob = await res.blob(); + return new Promise((resolve, reject) => { + const fr = new FileReader(); + fr.onload = () => resolve(fr.result); + fr.onerror = () => reject(fr.error); + fr.readAsDataURL(blob); + }); +}; + +/** + * @param {string} url + * @returns {Promise} + */ +external.blob = async url => { + const res = await external.fetch(url); + return res.blob(); +}; + +/** + * @param {string} url + * @param {string} returnExpression + * @template T + * @returns {Promise} + */ +external.evalAndReturn = async (url, returnExpression) => { + const res = await external.fetch(url); + const text = await res.text(); + const js = `${text}\nreturn ${returnExpression};`; + const fn = new Function(js); + return fn(); +}; + +module.exports = external; diff --git a/src/extensions/mistwarp_patching/index.js b/src/extensions/mistwarp_patching/index.js new file mode 100644 index 00000000000..ab29d42d9c8 --- /dev/null +++ b/src/extensions/mistwarp_patching/index.js @@ -0,0 +1,42 @@ +const ArgumentType = require('../../extension-support/argument-type'); +const BlockType = require('../../extension-support/block-type'); + +const input = defaultValue => ({ + type: ArgumentType.STRING, + defaultValue +}); + +const block = (opcode, blockType, text, defaults) => ({ + opcode, + blockType, + text, + arguments: Object.fromEntries(defaults.map((value, index) => { + const name = `ARG${index + 1}`; + return [name, input(value)]; + })), + allowDropAnywhere: blockType === BlockType.REPORTER, + func: 'unsupported' +}); + +class PatchingBlocks { + getInfo () { + return { + id: 'patching', + name: 'Patching', + color1: '#9966ff', + color2: '#855cd6', + color3: '#774dcb', + blocks: [ + block('jsreporter', BlockType.REPORTER, 'js [ARG1]', ['1 * 3']), + block('jsboolean', BlockType.BOOLEAN, 'js [ARG1]', ['1 === 1']), + block('jscommand', BlockType.COMMAND, 'js [ARG1]', ['console.log("hello")']) + ] + }; + } + + unsupported () { + throw new Error('Patching blocks require the compiler'); + } +} + +module.exports = PatchingBlocks; diff --git a/src/extensions/scratch3_boost/index.js b/src/extensions/scratch3_boost/index.js index 21564befb96..717940d46fd 100644 --- a/src/extensions/scratch3_boost/index.js +++ b/src/extensions/scratch3_boost/index.js @@ -19,7 +19,7 @@ const log = require('../../util/log'); * @type {string} */ // eslint-disable-next-line max-len -const iconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACpQTFRF////fIel5ufolZ62/2YavsPS+YZOkJmy9/j53+Hk6+zs6N/b6dfO////tDhMHAAAAA50Uk5T/////////////////wBFwNzIAAAA6ElEQVR42uzX2w6DIBAEUGDVtlr//3dLaLwgiwUd2z7MJPJg5EQWiGhGcAxBggQJEiT436CIfqXJPTn3MKNYYMSDFpoAmp24OaYgvwKnFgL2zvVTCwHrMoMi+nUQLFthaNCCa0iwclLkDgYVsQp0mzxuqXgK1MRzoCLWgkPXNN2wI/q6Kvt7u/cX0HtejN8x2sXpnpb8J8D3b0Keuhh3X975M+i0xNVbg3s1TIasgK21bQyGO+s2PykaGMYbge8KrNrssvkOWDXkErB8UuBHETjoYLkKBA8ZfuDkbwVBggQJEiR4MC8BBgDTtMZLx2nFCQAAAABJRU5ErkJggg=='; +const iconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACpQTFRF////6+zskJmy3+Hk6N/b+YZO/2Ya6dfO9/j5vsPSlZ62////fIel5ufo1AuBvgAAAAF0Uk5TAEDm2GYAAADNSURBVHja7dfRDoMgDIXhuQmbpbz/645JsspKOiM1u9j5E7gw8YtCSPSCEEII/VlE/aEjskeJ2LEXya6tYDLK79KOfgWm5AhOOU91HgftbJCoN46C+yJvkJ3XEKAJ6ujhBYo4BOaPblcRh0ERvUARh8A5xBhmQ2TW51uffQFDLIXciM0p1meaWCdgXLv3xfZ2eebvYO5VCWGMVVWvbIML89KA9cpmVptig1xqwHplMwso+YJuryy5bIpjZ4HZrZNA19w/OPE3gBBCCB3vCQkmeCf31OYLAAAAAElFTkSuQmCC'; /** * Boost BLE UUIDs. diff --git a/src/extensions/scratch3_ev3/index.js b/src/extensions/scratch3_ev3/index.js index 7803f2394e3..99255bc2bcf 100644 --- a/src/extensions/scratch3_ev3/index.js +++ b/src/extensions/scratch3_ev3/index.js @@ -14,7 +14,7 @@ const log = require('../../util/log'); * @type {string} */ // eslint-disable-next-line max-len -const blockIconURI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDAgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUwLjIgKDU1MDQ3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5ldjMtYmxvY2staWNvbjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJldjMtYmxvY2staWNvbiIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9ImV2MyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS41MDAwMDAsIDMuNTAwMDAwKSIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS1wYXRoIiBzdHJva2U9IiM3Qzg3QTUiIGZpbGw9IiNGRkZGRkYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgeD0iMC41IiB5PSIzLjU5IiB3aWR0aD0iMjgiIGhlaWdodD0iMjUuODEiIHJ4PSIxIj48L3JlY3Q+CiAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtcGF0aCIgc3Ryb2tlPSIjN0M4N0E1IiBmaWxsPSIjRTZFN0U4IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHg9IjIuNSIgeT0iMC41IiB3aWR0aD0iMjQiIGhlaWdodD0iMzIiIHJ4PSIxIj48L3JlY3Q+CiAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtcGF0aCIgc3Ryb2tlPSIjN0M4N0E1IiBmaWxsPSIjRkZGRkZGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHg9IjIuNSIgeT0iMTQuNSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjEzIj48L3JlY3Q+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNC41LDEwLjUgTDE0LjUsMTQuNSIgaWQ9IlNoYXBlIiBzdHJva2U9IiM3Qzg3QTUiIGZpbGw9IiNFNkU3RTgiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PC9wYXRoPgogICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLXBhdGgiIGZpbGw9IiM0MTQ3NTciIHg9IjQuNSIgeT0iMi41IiB3aWR0aD0iMjAiIGhlaWdodD0iMTAiIHJ4PSIxIj48L3JlY3Q+CiAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtcGF0aCIgZmlsbD0iIzdDODdBNSIgb3BhY2l0eT0iMC41IiB4PSIxMy41IiB5PSIyMC4xMyIgd2lkdGg9IjIiIGhlaWdodD0iMiIgcng9IjAuNSI+PC9yZWN0PgogICAgICAgICAgICA8cGF0aCBkPSJNOS4wNiwyMC4xMyBMMTAuNTYsMjAuMTMgQzEwLjgzNjE0MjQsMjAuMTMgMTEuMDYsMjAuMzUzODU3NiAxMS4wNiwyMC42MyBMMTEuMDYsMjEuNjMgQzExLjA2LDIxLjkwNjE0MjQgMTAuODM2MTQyNCwyMi4xMyAxMC41NiwyMi4xMyBMOS4wNiwyMi4xMyBDOC41MDc3MTUyNSwyMi4xMyA4LjA2LDIxLjY4MjI4NDcgOC4wNiwyMS4xMyBDOC4wNiwyMC41Nzc3MTUzIDguNTA3NzE1MjUsMjAuMTMgOS4wNiwyMC4xMyBaIiBpZD0iU2hhcGUiIGZpbGw9IiM3Qzg3QTUiIG9wYWNpdHk9IjAuNSI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNMTguOTEsMjAuMTMgTDIwLjQyLDIwLjEzIEMyMC42OTYxNDI0LDIwLjEzIDIwLjkyLDIwLjM1Mzg1NzYgMjAuOTIsMjAuNjMgTDIwLjkyLDIxLjYzIEMyMC45MiwyMS45MDYxNDI0IDIwLjY5NjE0MjQsMjIuMTMgMjAuNDIsMjIuMTMgTDE4LjkyLDIyLjEzIEMxOC4zNjc3MTUzLDIyLjEzIDE3LjkyLDIxLjY4MjI4NDcgMTcuOTIsMjEuMTMgQzE3LjkxOTk3MjYsMjAuNTgxNTk3IDE4LjM2MTYyNDUsMjAuMTM1NDg0IDE4LjkxLDIwLjEzIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzdDODdBNSIgb3BhY2l0eT0iMC41IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOS40MjAwMDAsIDIxLjEzMDAwMCkgcm90YXRlKC0xODAuMDAwMDAwKSB0cmFuc2xhdGUoLTE5LjQyMDAwMCwgLTIxLjEzMDAwMCkgIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik04LjIzLDE3LjUgTDUsMTcuNSBDNC43MjM4NTc2MywxNy41IDQuNSwxNy4yNzYxNDI0IDQuNSwxNyBMNC41LDE0LjUgTDEwLjUsMTQuNSBMOC42NSwxNy4yOCBDOC41NTQ2Njk2MSwxNy40MTc5MDgyIDguMzk3NjUwMDYsMTcuNTAwMTU2NiA4LjIzLDE3LjUgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjN0M4N0E1IiBvcGFjaXR5PSIwLjUiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTE4LjE1LDE4Ljg1IEwxNy42NSwxOS4zNSBDMTcuNTUyMzQxNiwxOS40NDQwNzU2IDE3LjQ5ODAzMzksMTkuNTc0NDE0MiAxNy41LDE5LjcxIEwxNy41LDIwIEMxNy41LDIwLjI3NjE0MjQgMTcuMjc2MTQyNCwyMC41IDE3LDIwLjUgTDE2LjUsMjAuNSBDMTYuMjIzODU3NiwyMC41IDE2LDIwLjI3NjE0MjQgMTYsMjAgQzE2LDE5LjcyMzg1NzYgMTUuNzc2MTQyNCwxOS41IDE1LjUsMTkuNSBMMTMuNSwxOS41IEMxMy4yMjM4NTc2LDE5LjUgMTMsMTkuNzIzODU3NiAxMywyMCBDMTMsMjAuMjc2MTQyNCAxMi43NzYxNDI0LDIwLjUgMTIuNSwyMC41IEwxMiwyMC41IEMxMS43MjM4NTc2LDIwLjUgMTEuNSwyMC4yNzYxNDI0IDExLjUsMjAgTDExLjUsMTkuNzEgQzExLjUwMTk2NjEsMTkuNTc0NDE0MiAxMS40NDc2NTg0LDE5LjQ0NDA3NTYgMTEuMzUsMTkuMzUgTDEwLjg1LDE4Ljg1IEMxMC42NTgyMTY3LDE4LjY1MjE4NjMgMTAuNjU4MjE2NywxOC4zMzc4MTM3IDEwLjg1LDE4LjE0IEwxMi4zNiwxNi42NSBDMTIuNDUwMjgwMywxNi41NTI4NjE3IDEyLjU3NzM5NjEsMTYuNDk4MzgzNSAxMi43MSwxNi41IEwxNi4yOSwxNi41IEMxNi40MjI2MDM5LDE2LjQ5ODM4MzUgMTYuNTQ5NzE5NywxNi41NTI4NjE3IDE2LjY0LDE2LjY1IEwxOC4xNSwxOC4xNCBDMTguMzQxNzgzMywxOC4zMzc4MTM3IDE4LjM0MTc4MzMsMTguNjUyMTg2MyAxOC4xNSwxOC44NSBaIiBpZD0iU2hhcGUiIGZpbGw9IiM3Qzg3QTUiIG9wYWNpdHk9IjAuNSI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNMTAuODUsMjMuNDUgTDExLjM1LDIyLjk1IEMxMS40NDc2NTg0LDIyLjg1NTkyNDQgMTEuNTAxOTY2MSwyMi43MjU1ODU4IDExLjUsMjIuNTkgTDExLjUsMjIuMyBDMTEuNSwyMi4wMjM4NTc2IDExLjcyMzg1NzYsMjEuOCAxMiwyMS44IEwxMi41LDIxLjggQzEyLjc3NjE0MjQsMjEuOCAxMywyMi4wMjM4NTc2IDEzLDIyLjMgQzEzLDIyLjU3NjE0MjQgMTMuMjIzODU3NiwyMi44IDEzLjUsMjIuOCBMMTUuNSwyMi44IEMxNS43NzYxNDI0LDIyLjggMTYsMjIuNTc2MTQyNCAxNiwyMi4zIEMxNiwyMi4wMjM4NTc2IDE2LjIyMzg1NzYsMjEuOCAxNi41LDIxLjggTDE3LDIxLjggQzE3LjI3NjE0MjQsMjEuOCAxNy41LDIyLjAyMzg1NzYgMTcuNSwyMi4zIEwxNy41LDIyLjU5IEMxNy40OTgwMzM5LDIyLjcyNTU4NTggMTcuNTUyMzQxNiwyMi44NTU5MjQ0IDE3LjY1LDIyLjk1IEwxOC4xNSwyMy40NSBDMTguMzQwNTcxNCwyMy42NDQ0MjE4IDE4LjM0MDU3MTQsMjMuOTU1NTc4MiAxOC4xNSwyNC4xNSBMMTYuNjQsMjUuNjUgQzE2LjU0OTcxOTcsMjUuNzQ3MTM4MyAxNi40MjI2MDM5LDI1LjgwMTYxNjUgMTYuMjksMjUuOCBMMTIuNzEsMjUuOCBDMTIuNTc3Mzk2MSwyNS44MDE2MTY1IDEyLjQ1MDI4MDMsMjUuNzQ3MTM4MyAxMi4zNiwyNS42NSBMMTAuODUsMjQuMTUgQzEwLjY1OTQyODYsMjMuOTU1NTc4MiAxMC42NTk0Mjg2LDIzLjY0NDQyMTggMTAuODUsMjMuNDUgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjN0M4N0E1IiBvcGFjaXR5PSIwLjUiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTIxLjUsMjcuNSBMMjYuNSwyNy41IEwyNi41LDMxLjUgQzI2LjUsMzIuMDUyMjg0NyAyNi4wNTIyODQ3LDMyLjUgMjUuNSwzMi41IEwyMS41LDMyLjUgTDIxLjUsMjcuNSBaIiBpZD0iU2hhcGUiIHN0cm9rZT0iI0NDNEMyMyIgZmlsbD0iI0YxNUEyOSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4='; +const blockIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgdmlld0JveD0iMCAwIDQwIDQwIj48dGl0bGU+ZXYzLWJsb2NrLWljb248L3RpdGxlPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNS41IDMuNSkiPjxyZWN0IHdpZHRoPSIyOCIgaGVpZ2h0PSIyNS44MSIgeD0iLjUiIHk9IjMuNTkiIGZpbGw9IiNmZmYiIHN0cm9rZT0iIzdjODdhNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiByeD0iMSIvPjxyZWN0IHdpZHRoPSIyNCIgaGVpZ2h0PSIzMiIgeD0iMi41IiB5PSIuNSIgZmlsbD0iI2U2ZTdlOCIgc3Ryb2tlPSIjN2M4N2E1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHJ4PSIxIi8+PHBhdGggZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjN2M4N2E1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik0yLjUgMTQuNWgyNHYxM2gtMjR6Ii8+PHBhdGggZmlsbD0iI2U2ZTdlOCIgc3Ryb2tlPSIjN2M4N2E1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik0xNC41IDEwLjV2NCIvPjxyZWN0IHdpZHRoPSIyMCIgaGVpZ2h0PSIxMCIgeD0iNC41IiB5PSIyLjUiIGZpbGw9IiM0MTQ3NTciIHJ4PSIxIi8+PHJlY3Qgd2lkdGg9IjIiIGhlaWdodD0iMiIgeD0iMTMuNSIgeT0iMjAuMTMiIGZpbGw9IiM3Yzg3YTUiIG9wYWNpdHk9Ii41IiByeD0iLjUiLz48cGF0aCBmaWxsPSIjN2M4N2E1IiBkPSJNOS4wNiAyMC4xM2gxLjVhLjUuNSAwIDAgMSAuNS41djFhLjUuNSAwIDAgMS0uNS41aC0xLjVhMSAxIDAgMCAxIDAtMk0xOS45MyAyMi4xM2gtMS41MWEuNS41IDAgMCAxLS41LS41di0xYS41LjUgMCAwIDEgLjUtLjVoMS41YTEgMSAwIDAgMSAuMDEgMk04LjIzIDE3LjVINWEuNS41IDAgMCAxLS41LS41di0yLjVoNmwtMS44NSAyLjc4YS41MS41MSAwIDAgMS0uNDIuMjJNMTguMTUgMTguODVsLS41LjVhLjUuNSAwIDAgMC0uMTUuMzZWMjBhLjUuNSAwIDAgMS0uNS41aC0uNWEuNS41IDAgMCAxLS41LS41LjUuNSAwIDAgMC0uNS0uNWgtMmEuNS41IDAgMCAwLS41LjUuNS41IDAgMCAxLS41LjVIMTJhLjUuNSAwIDAgMS0uNS0uNXYtLjI5YS41LjUgMCAwIDAtLjE1LS4zNmwtLjUtLjVhLjUxLjUxIDAgMCAxIDAtLjcxbDEuNTEtMS40OWEuNDcuNDcgMCAwIDEgLjM1LS4xNWgzLjU4YS40Ny40NyAwIDAgMSAuMzUuMTVsMS41MSAxLjQ5YS41MS41MSAwIDAgMSAwIC43MU0xMC44NSAyMy40NWwuNS0uNWEuNS41IDAgMCAwIC4xNS0uMzZ2LS4yOWEuNS41IDAgMCAxIC41LS41aC41YS41LjUgMCAwIDEgLjUuNS41LjUgMCAwIDAgLjUuNWgyYS41LjUgMCAwIDAgLjUtLjUuNS41IDAgMCAxIC41LS41aC41YS41LjUgMCAwIDEgLjUuNXYuMjlhLjUuNSAwIDAgMCAuMTUuMzZsLjUuNWEuNS41IDAgMCAxIDAgLjdsLTEuNTEgMS41YS40Ny40NyAwIDAgMS0uMzUuMTVoLTMuNThhLjQ3LjQ3IDAgMCAxLS4zNS0uMTVsLTEuNTEtMS41YS41LjUgMCAwIDEgMC0uNyIgb3BhY2l0eT0iLjUiLz48cGF0aCBmaWxsPSIjZjE1YTI5IiBzdHJva2U9IiNjYzRjMjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iTTIxLjUgMjcuNWg1djRhMSAxIDAgMCAxLTEgMWgtNHoiLz48L2c+PC9zdmc+'; /** * String with Ev3 expected pairing pin. diff --git a/src/extensions/scratch3_gdx_for/index.js b/src/extensions/scratch3_gdx_for/index.js index e88b142e639..64bfae8f00a 100644 --- a/src/extensions/scratch3_gdx_for/index.js +++ b/src/extensions/scratch3_gdx_for/index.js @@ -12,14 +12,14 @@ const ScratchLinkDeviceAdapter = require('./scratch-link-device-adapter'); * @type {string} */ // eslint-disable-next-line max-len -const blockIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAACCNJREFUeAHtnGtsFFUUgM+dfXbbbbcWaKHSFgrlkWgkJCb6A4kmJfiHIBYBpcFfRg1GEkmEVAvhFYw/TExMxGoICAECiZEIIUQCiiT4gh+KILRQCi2ENIV2t/ue6zl3u2Upu4XuzO4csCe587iPmXO/OWfunTszV4ABWfflQU+0p+9bTcLzEmS5gUPlvagAcVMXcMpnK1u+evW8QLYKaNkWpHKxnt6dQsqFjxo80p10Jt1vx7t30n62Ys+2IJUTUpDlqUNomgYutwsjhZFD5r6slBAOhUHX9YTe6D1GTmrIAhFeBZ2c4JFCpBiggmwlBR7pTGLUewxZYBIUWV7yqgb7g8lotuukt5ihqyELHCSEbusk931ExMxbjSkWSNxEyr3vysxZLFHWnDuT0CtFV6OKmmOBRrV4hMubZoGmMZA6lHTfgsLeHnBEIiCxUY86XRDw+sBfOgZ0m820U5lxIFYAncF+GNvVDo5QaLBu1ClyYTyF4tvd8lZltQgXFA6mW73BxoVt0ShUXG2VCp4QQdDEFqez4Bm7p7gaO0of422r3x4Ji/KrbdIexu4SE2FjgWO6OkCLx6gt6gxOiNV92tiY+ni1Ye1nu7dpQfk35ikru9EBN6unsEDIwgLJPQv8dwCfT3WPt+iFIfAUqM3vL7vpjmuz0KX1gkAfOMN33dxKkjwA9vsTDIS8uubdBZcyAWlqWtohQbRSuru/L1O2vMazAGiLxRKVFqDgDEdAaHCN0kU8Ply2vKWxABhzJZ5ipC6qHlRzfJxVz99S49GdYQEw7PYkuAmokZJ6fumlQUqiNpVSQ56i9JnyHMsCYMRdADGHk0ZyHM1b976XicH0rXtWYR57FPNSGQ7CAiCBCJQ8oXhI0FdmBiPfVnl9ZZmz5DmFDcA+HwIUOEYMcjL2+e57PbBp04HxONI4ifIEKC8TYQMwhs+7IU+hwBFOYQvB5qF8grbwJnRfQXnIhbkIG4AExF+ScE00w0X3AZLwisrDyH1JH1YAA8UlIG029FRZsu6TPfVJiIltWYIjMTLgLUlGs1izeRYmGtS383t9wnu7G2J6fH/Tln2LNUdExGLxvZSOQ1qCS/+P9CFhBZAUuj12PHgCvRJHZ7w4EnhYjya6hXGHQ2Jaxj4ilbVC2AFEUNBVXSdKb3WC29+rmISKiqFn7ARBadyEHUACFHM64VZlDTdWafVh1Yik1ZB5JEsLJGaVtosw37ld4TscWQHX4+oRWO1zWrAEWCR6oMnTCEXijmI1234MVvsPgV+WcmKndGHpwlNtZwbhkZYEkuI4CkuAXfpk0HGAPym0TXEchaUL39Br4JvQeljk+lwxOxBeCRQ3UrFHI+AMBsEV6gcnhlwIS4BU0RORV1V42EqnwnLgSyo3AsM3eA9bPOt8bAEOV6NUWGRZ9FYvHSx6R0pfYgkMmk2DCH1+Z7KwB5gKazjLGgpLgUOAuRZWALnDSncxLAOYCmskbqjhe02h5d6y0sFKF5cXgI8LrLwB9PTeGew6POwNnptlpYOVLi4nFjjuWts957rnBk8tomoZ+bjhPcqOcCcnAG34EaTqOjxmsNKxzQnAkX5wronsOry6zIn66ThljLNcg+W1a2Gi55+MCg6XcKl3NuxrbxouS87TLAcY1V0QV5+8jLyuEekeeSGTS1gOcM/lZpOrlN/DsRzOyi8CY2fLuwUum/wR1BT+ZUzrDKUv9D4LB9rXZEjNTfRjZYFS5r86ebfA3W0bcmMKFh01/5fMoorm6rSjAA2SNc2F8dvmQVWCgdy8fxg8gcEN0pWez80QUyyQFAqn/N9mhmK5PAYN7adecCPnMsUCCZ7U8ari4IGb87wJeKFDA/MlmHXBDVkgTR1CV4/gaThKzBoeKYpuSzqSrqSzEiFuJDayWxqyQJp3RUhYSKfWUSEz5iDIrhrZl8I5b37JvrTBT3wdpd43cOqT/WiJhq6ikQpkW5a8BxuS/X219uXZHoPKmdMUGdEgpWzTll3Kr95Z8VJK7N3NL7b/qHY2rnmdjd6G7oF3q/b/3RoFaPDajwIcBWiQgMHioxZoEKChfqDBc2csnmxtM2ZglMDKArFvduhBbLDv9sOD8oymA0xBCHVtl6+c7ey6Ibdt+3ox7WOoxMCmD4i68PrZkBQaEDUe1tnVqSyyfl79+vr6evz1C2jKogkYWEEc0JnViiZRqKuoqJiZtEJcn0GIsykewzhW2jJVZjzBamxsfK79ase/5MoXL106TnEDwfq36qgIF6HGjKyqFsNkDGMwUNxEDEmIHQTxyNGjH1AchvumBcC4vAuXVpiA+TDYMFDXiiZFoN+SrmMI7tixo/v3337diNtQUzNpPq1RChIra5ccAFKDUEwYLra2fnXu3PmtA0gojqbaVUNl23ft+pPiPW73U7RGYdGH5QCQYCg93C73075S34I5c+ZQa0s/B1Njou51tVVVatJAXcrED3Q4EI5plgsHgAQiSiRCoRD9ECeam9fPo32UJzFQYwJLlix9mdZ9fb1naY2iyiQ2rVtyAEi199Pi5M8/tdB62vRpzceOH3+toaHBh61w2clTp96sqq5ehUnxw0eO7KA8KKpMYtO6JZcOKTUeNRhsp0+ffmtilYI1VLf4+Qvn1784d+5ezEfW144hMR05blglpDgHSbqxt6Wl5Y8ZM6afKq8oL7LZHd54PH7H7w+cOPj9dx8uXbLk+ICynbhm4cJDr7LVMKmhoP5dphaWoFGrHMTAQrgBJCjkFdQHpPntqCUmiWCge14PBsvdFnUYlP8AMAKfKIKmYukAAAAASUVORK5CYII='; +const blockIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAABVNJREFUeNrtnH9MG1UcwMuIiWMaE7c5ptkUhyQaEzWLi8aE+BfRPxbjEowxipMlisxlTFAY9JAQoNfyG/wRGQyH9uj6AyiFzblRuohzxCmYjZ9tZaNlEGPUaNTEQZ/vW97Zs/bWwsKul3y/ySe8e+8Vvvn0vXv3jvY0NxJlHzuSSnihi9MJC1qdkagJyBlyr64+tUGjVGh5ow2SUTMgUTGBnE6YFxMp1XeSysYuUtnUHddAjpCrdCQqJlAiTypRFfKkEpUWKE1MFbA3On4EwrtbwRJSA2yWxJdAaUIv28fjEkm+KBAFytFziexvGyTv1neREr2JFBtM5J2GbpJL67K6LqLA65FtukAK622y566iWmtgn+kbFBiJV63f09F2PBD8Hbzwp1YvVJXXdj1S1ujYrtV1chxv/APaoM9e8wgKDCe/uS/4WipqrqCj43/bq+IGYQtt/4lC8pt6UaCUfaYL4q5gSfeBPVUjExUVnds4nXEJ+mabv0OBIrlHXeLom4n+N4Vp6Jv7yVkUKHKg5cyyQL3xTNT9t15wQt/9bU4UKPLmsS/Za4Xp6HeAhPHgCGzHEfgv2ce/JWz1/ZsQkqCRiUxCEmmfa7QvvAYFSimqsSxv9HnTQdnpy3cWQJ/CGguuwuEcODLAFhLBIy9Q8EKft1qdKDCcvZYRmMIBLW8MwDWfJiwqK21boR14zTqKAiNR0GQXR2FbhMXjKG2DPriVkyPn2JC4Gv+qCQuog7acjiEUKMcr3RdJicEU3A+XGUwZGhZQhrpi2kb7oMDrcfCjz9kljfE3rc78TGnNZ88ul43QhrezYrkrc7jGHByFUqCOtqHA2FbkUXLowxPksMEEQBnq8I403tJHgeoRWNhnJ64vngegjAJXQk7vV+R35x2EDGoAKEMdCoyV2v73QZwUqEOBsVLgOEGWBhNEeVCGOhS4Eo6cLCc/OzcDUF7d5ZB1lLz+6dfBOz35zQ5chWOV9XaTA/79CblIQYEyI0tWFscL5D2DiZTVmEl5vVU1AhUZWeGyKiJ8TlE9ApWXBahW4JpOw4qGaLLUL1BhWeoXqKAs9QuMLqtOVhYKZMexyEKBcgLZ8YrQNVtWAwoEZvsfhP3uqnDbd6JAr+NRsuhMXBVjPU+hQDwHosCbK3Cm72E4f60Jk/ZdKPBGmOh5AqcwTmEUiALx665RgFzjSiAkxOkFNX3hGnKOH4GiPE4FX/mHHFnOyguUPu6kVC+o56ET0tnCC/OKCYRHhkASaqZUJ1gVEwgP3uGqBAs8/kSND97heMFyyGxer1FnyJ9Tr84vRERs12CgQBSIAlEgBgpcC4HyoMAYdjb90eRxvNCHpqJHKiXth5nLozB1W1raXoBjyj2UBNQTPe4GYUPnzlWBwMtXfBMZGRk7UWLskQSykpOTHxJHIf05IpF4FyqKHltBVlZW1pNXZn3TINHt8bigjnErKgrFOjaqdlDup2xiddskEn0g8dTp0wVM4BbUxoLJSwtjo1SizWZ7AwROuT0DrP0+1LYcCeKq6/Z6z46PT3YzQSms/RY43r1nz+Mg0Ofz/8jaU1FdSGAa4PPP/UIlBdLT0x9jdUmU26Gcl5f3NAikU9nN2nagulCkgBS3x+sESQMDg0VwLOX8+WEDtF0aG7Owuu2oLRSbQUp7e/tLIMk/d/Uvp8vFZWZm7oIFhF4P6mj9NcpidV3dbibwTtQWikQ2JdOGh4drYRpTSBiLIFVyflyH2v4bt4EcoLW19cXJqamTs/65BXrO809MTvc2NjY+B22M9agrcmxg14FpMqSgvNim8yZ2nfcA417Kxnictv8ABNVN4ivCsdYAAAAASUVORK5CYII='; /** * Icon png to be displayed in the blocks category menu, encoded as a data URI. * @type {string} */ // eslint-disable-next-line max-len -const menuIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGPC/xhBQAAA9dJREFUWAnNmE2IFEcUgF/9dE/v7LoaM9kkK4JBRA0EFBIPRm85hBAvEXHXwyo5eFE87GFcReMkObgJiQnkkJzEg9n8HIJixKNe1IMKihgiCbviwV11V3d0d3pmuqsqr5ppcEnb3TNVggVFVVe9eu+r97qqq4tASqp8/fsboQgmU0TMugi571K29bPy9ovPU8Sf16HbpQj3EkYFBcJcr5Am2nZfs94AIWVfqMQeHNwhICUBZ4ypUIA/X2sbIm2AW8AJK0lkEP6TJpfqwXgg4QxmF/fB7Gtvxk1G5ZKHU1CqTgPJoSUXYJYeohSUJu+qrqdVUGh2/pVX4VFffx77WaqBZkrkEFj271+qWH0sXcU3FBzyQe/Mg7B//LbKMTRTxNiDbsMHHjTJlyM7HEJIBHXs2KXFj+oTNSdoQOCYLS5jD9IwBMm5H8NplwwPb/QV4yEIcycaAza9IuA76B38fuz1OF5RXUkmHCdu6rg0BpSMgV/sAe7DdzGFrvvdi0D3mSZjQA0wt7REQsY+iWF0XbfFzyal8SLRxuteD+Du4h4Z/flbqaBHibAQtZmQtcZaAZSMwtTylaR/4vaw1ju5YhWG10pwwAqghmp2FeHO2+t11WqyM80W0m7vAOhsM1kD7CGz8L57Jsq6bitZC/GcWgLf1H6KuHT92cTDAFy/BgXMXm0OCpgV50Bo9kK3BqiBboabQMMU/WoL5im4jToeq/AIgXsiRx5KKCjcwPEsiAv/BQMu9EwyDHXd/3kqCOSzDk6t5/YglQKKeJwq+PNRmJI8kwSTaj1HZy5AhSHqnXkIvU9mMUwEw4Q5wTM57LUtkg8QPw/cdcBJ+PhvKJ0Gj80nGq6JXrg6/XFiX97GXIBpyqTieKpKViOl+WEhWXMaUavvvdIZ8Giy5+Lh3bwKm/t+Be3JazMfxc1tldY26rastiHcsQevTG9pw0znovkAcRWHzSDKnZtaOJLSfMFLB5RqtRBS4LbCurqLCy0YPkU3C0IIPEimMqR2ei7ZX2+KQdRi/WahNT/GmfOD4Vyzhx/66pcjp85dUvcmp6J8+txldXh07PPskdkS+V6EbD0vTOKlB0x9B/O6BS8ULly9PgE6x4kDPR/XX5pyYKj8xcCucsUmkNUQE0JvKKm2VioVK5HRE7UKOHbi6B94RzP+93jtpC0vWgXUF0hr3ipuw8uadwd3jXxoA9IK4Pah8t6BneV9GgjD28Svw1mlxFobgFbeFTz13cKbth93fDryp2CEq0a4hTA+aAPQ/ESJFDdvXLzzzrqNjlTqOP6uDeFf0uhvJ0ZP2QD8D6ZzU6u8YIbBAAAAAElFTkSuQmCC'; +const menuIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAALGPC/xhBQAAAppJREFUeNrtmF1r01AYx6OI4CfQG2+88BMIXnjhy5V3XoikHZq+bCsKszChsS9Lk5WONFnbbSKIm5frSdLVrhWldm4qEzoVX5CpeCFeidsnENGZs/OEhcFaxtYl67noA394esp5+uuTf05ODrNdSGrx2JBcwK4pg1ZTqnGGaTeSMkoLqrYmqjoeuTPrqEhNADSTCkJtAw4pmijlilhUNMe7l8qXsEhqCxk0vGdA0MCDBXy1+tUJkVrPsVV3vwCvVb7gwXs1M67qZkw1zPDUvEkVYDQ7YyYyaE1SSqekseIF4q2//NisSQVgsPje8hSJA/a8fL5xBMYCpY+dB+xDb3B81Pi9dW5CNf4FjA+dB+TKyzhBvBcfR0fteZAnFM2E76jw4K27j82kvLmeQQ5j1NwkIfQax1Xjjz0PchijBpArfwYfmmKmkBPkwn24QWCMGkBQUH+HAQzUq73d2ULdfZJs0WL9EohOwOuPGvj/i4MgyOnsoPJkEtQ07n/4CYeml/DNqQUcmahaPhVHjf0HbIapwCKOE7Bdy1p1rG3WMMmTqu44YFsw6fFy02ZVyrkAGJ6c24CZ3w0MyH1AMWuAbzZgZraD6QigXazljz1DfvzKuNJSddTbecB6oQ+/1L0tVZsOdQ5wDgXxos7uSE8L/V1AG7BduQzo/Hsx1HQAUEZIUHXXThbg1ELIaCNtA6Zz2nH4t24Kzn8YtwOsUKk18K+VVUvV2tKuLl0XkHpAQUVnm7wla+cY2sLD8SmPn5cYWsPri15muciyJEmHqASEAySPj6+STuoMrUG6d9jji3z3+qMXqYFiOX6AdC5sfyb5BIEcpAawh+PPE8hvPcHoCbY/dpL48IcnEDvN0BTQMdYXWSH6yfpu33Cq7jqUK06WtbQJQQAAAABJRU5ErkJggg=='; /** * Enum for Vernier godirect protocol. diff --git a/src/extensions/scratch3_makeymakey/index.js b/src/extensions/scratch3_makeymakey/index.js index e57bc76e89d..550736ea979 100644 --- a/src/extensions/scratch3_makeymakey/index.js +++ b/src/extensions/scratch3_makeymakey/index.js @@ -8,7 +8,7 @@ const Cast = require('../../util/cast'); * @type {string} */ // eslint-disable-next-line max-len -const blockIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHN0eWxlPi5zdDJ7ZmlsbDpyZWR9LnN0M3tmaWxsOiNlMGUwZTB9LnN0NHtmaWxsOm5vbmU7c3Ryb2tlOiM2NjY7c3Ryb2tlLXdpZHRoOi41O3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PHBhdGggZD0iTTM1IDI4SDVhMSAxIDAgMCAxLTEtMVYxMmMwLS42LjQtMSAxLTFoMzBjLjUgMCAxIC40IDEgMXYxNWMwIC41LS41IDEtMSAxeiIgZmlsbD0iI2ZmZiIgaWQ9IkxheWVyXzYiLz48ZyBpZD0iTGF5ZXJfNCI+PHBhdGggY2xhc3M9InN0MiIgZD0iTTQgMjVoMzJ2Mi43SDR6TTEzIDI0aC0yLjJhMSAxIDAgMCAxLTEtMXYtOS43YzAtLjYuNC0xIDEtMUgxM2MuNiAwIDEgLjQgMSAxVjIzYzAgLjYtLjUgMS0xIDF6Ii8+PHBhdGggY2xhc3M9InN0MiIgZD0iTTYuMSAxOS4zdi0yLjJjMC0uNS40LTEgMS0xaDkuN2MuNSAwIDEgLjUgMSAxdjIuMmMwIC41LS41IDEtMSAxSDcuMWExIDEgMCAwIDEtMS0xeiIvPjxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjIyLjgiIGN5PSIxOC4yIiByPSIzLjQiLz48Y2lyY2xlIGNsYXNzPSJzdDIiIGN4PSIzMC42IiBjeT0iMTguMiIgcj0iMy40Ii8+PHBhdGggY2xhc3M9InN0MiIgZD0iTTQuMiAyN2gzMS45di43SDQuMnoiLz48L2c+PGcgaWQ9IkxheWVyXzUiPjxjaXJjbGUgY2xhc3M9InN0MyIgY3g9IjIyLjgiIGN5PSIxOC4yIiByPSIyLjMiLz48Y2lyY2xlIGNsYXNzPSJzdDMiIGN4PSIzMC42IiBjeT0iMTguMiIgcj0iMi4zIi8+PHBhdGggY2xhc3M9InN0MyIgZD0iTTEyLjUgMjIuOWgtMS4yYy0uMyAwLS41LS4yLS41LS41VjE0YzAtLjMuMi0uNS41LS41aDEuMmMuMyAwIC41LjIuNS41djguNGMwIC4zLS4yLjUtLjUuNXoiLz48cGF0aCBjbGFzcz0ic3QzIiBkPSJNNy4yIDE4Ljd2LTEuMmMwLS4zLjItLjUuNS0uNWg4LjRjLjMgMCAuNS4yLjUuNXYxLjJjMCAuMy0uMi41LS41LjVINy43Yy0uMyAwLS41LS4yLS41LS41ek00IDI2aDMydjJINHoiLz48L2c+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGNsYXNzPSJzdDQiIGQ9Ik0zNS4yIDI3LjlINC44YTEgMSAwIDAgMS0xLTFWMTIuMWMwLS42LjUtMSAxLTFoMzAuNWMuNSAwIDEgLjQgMSAxVjI3YTEgMSAwIDAgMS0xLjEuOXoiLz48cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMzUuMiAyNy45SDQuOGExIDEgMCAwIDEtMS0xVjEyLjFjMC0uNi41LTEgMS0xaDMwLjVjLjUgMCAxIC40IDEgMVYyN2ExIDEgMCAwIDEtMS4xLjl6Ii8+PC9nPjwvc3ZnPg=='; +const blockIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHN0eWxlPi5zdDJ7ZmlsbDpyZWR9LnN0M3tmaWxsOiNlMGUwZTB9LnN0NHtmaWxsOm5vbmU7c3Ryb2tlOiM2NjY7c3Ryb2tlLXdpZHRoOi41O3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PHBhdGggaWQ9IkxheWVyXzYiIGZpbGw9IiNmZmYiIGQ9Ik0zNSAyOEg1YTEgMSAwIDAgMS0xLTFWMTJjMC0uNi40LTEgMS0xaDMwYy41IDAgMSAuNCAxIDF2MTVjMCAuNS0uNSAxLTEgMSIvPjxnIGlkPSJMYXllcl80Ij48cGF0aCBkPSJNNCAyNWgzMnYyLjdINHptOS0xaC0yLjJhMSAxIDAgMCAxLTEtMXYtOS43YzAtLjYuNC0xIDEtMUgxM2MuNiAwIDEgLjQgMSAxVjIzYzAgLjYtLjUgMS0xIDEiIGNsYXNzPSJzdDIiLz48cGF0aCBkPSJNNi4xIDE5LjN2LTIuMmMwLS41LjQtMSAxLTFoOS43Yy41IDAgMSAuNSAxIDF2Mi4yYzAgLjUtLjUgMS0xIDFINy4xYTEgMSAwIDAgMS0xLTEiIGNsYXNzPSJzdDIiLz48Y2lyY2xlIGN4PSIyMi44IiBjeT0iMTguMiIgcj0iMy40IiBjbGFzcz0ic3QyIi8+PGNpcmNsZSBjeD0iMzAuNiIgY3k9IjE4LjIiIHI9IjMuNCIgY2xhc3M9InN0MiIvPjxwYXRoIGQ9Ik00LjIgMjdoMzEuOXYuN0g0LjJ6IiBjbGFzcz0ic3QyIi8+PC9nPjxnIGlkPSJMYXllcl81Ij48Y2lyY2xlIGN4PSIyMi44IiBjeT0iMTguMiIgcj0iMi4zIiBjbGFzcz0ic3QzIi8+PGNpcmNsZSBjeD0iMzAuNiIgY3k9IjE4LjIiIHI9IjIuMyIgY2xhc3M9InN0MyIvPjxwYXRoIGQ9Ik0xMi41IDIyLjloLTEuMmMtLjMgMC0uNS0uMi0uNS0uNVYxNGMwLS4zLjItLjUuNS0uNWgxLjJjLjMgMCAuNS4yLjUuNXY4LjRjMCAuMy0uMi41LS41LjUiIGNsYXNzPSJzdDMiLz48cGF0aCBkPSJNNy4yIDE4Ljd2LTEuMmMwLS4zLjItLjUuNS0uNWg4LjRjLjMgMCAuNS4yLjUuNXYxLjJjMCAuMy0uMi41LS41LjVINy43Yy0uMyAwLS41LS4yLS41LS41TTQgMjZoMzJ2Mkg0eiIgY2xhc3M9InN0MyIvPjwvZz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTM1LjIgMjcuOUg0LjhhMSAxIDAgMCAxLTEtMVYxMi4xYzAtLjYuNS0xIDEtMWgzMC41Yy41IDAgMSAuNCAxIDFWMjdhMSAxIDAgMCAxLTEuMS45eiIgY2xhc3M9InN0NCIvPjxwYXRoIGQ9Ik0zNS4yIDI3LjlINC44YTEgMSAwIDAgMS0xLTFWMTIuMWMwLS42LjUtMSAxLTFoMzAuNWMuNSAwIDEgLjQgMSAxVjI3YTEgMSAwIDAgMS0xLjEuOXoiIGNsYXNzPSJzdDQiLz48L2c+PC9zdmc+'; /** * Length of the buffer to store key presses for the "when keys pressed in order" hat diff --git a/src/extensions/scratch3_microbit/index.js b/src/extensions/scratch3_microbit/index.js index fbc7a903f30..1d1ddc3925b 100644 --- a/src/extensions/scratch3_microbit/index.js +++ b/src/extensions/scratch3_microbit/index.js @@ -11,7 +11,7 @@ const Base64Util = require('../../util/base64-util'); * @type {string} */ // eslint-disable-next-line max-len -const blockIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAKcElEQVR42u2cfXAU9RnHv7u3L3d7l9yR5PIGXO7MkQKaYiCUWqJhFGvRMk4JZXSc8aXVaSmiYlthVHQEW99FxiIdrVY6teiMdoa+ICqhIqgQAsjwMgYDOQKXl7uY17u9293b3f5x5JKYe8+FJGSfvzbP/n77e/azz+95nt9v90KoqgpN0hdSQ6AB1ABqADWAmmgANYAaQA2gJhpADeBEE2q8GPLaWzu/CslyiY4k9dOn5uijtXGd7+jWkaReVpT3Hrhv6d0awEFC07rgD+ZeYYnXprhwigUAvjj0zbjxQCLebozT7iDzK1ZUWCru2K7L//6MVC8ue45Blz8n6rlQ815QtuohOlXiEdy/AUqPa6y59Mkh6Q1345GNja6m7pHEQKNl3t0704EXat4L6fSOmOeEI1vHKzwAyNJR9MPFpRUPOu0ONm2A0xatWaTLm5WfDrzvAppA8AbiG03fC8CQNkDKZK2YrPAuRrhpifJERsuYywveJc7CqcIDMAyeLm82dEXzw39I/qjXkpr3QuW9lxfAdOABGAKPslWDnbsy7Jl8BxTeM3SqmO0gaA5U6c3jymup0YSn9JyLee67wpTfBQAQjmyF3HFqiJcRtDECjy5dAmbmcgQPvjjxl3Lx4IVjnD/5cE1zkWtyP34VBGcdKLJnLgc9cznk1kMXFdzEn8KJ4KUqqsSHvcxWDf7j1UM8UPr6/YgHhhX8xAaYaXgAIB7fBnbuSrBzV8aNgarEQ/z6/YkLcDTg9V9XlXjQtuqoU1TpcUHlvZDOfDiuyh5qPMCLrJ1bDw3EuUtx81N/BH3pjQBJQ2HMF5V6iKfeRchVm9kkMtrwxmSdobeA9daBde8GwVlBcFYofS1Jw0vaAy9HeJHQwBUPzIBvGxDc92Rmp/BowJs10wkAONfsBs8HAAAltqngOAO8HZ3o6OiMqcvLy4E1Lwc8H8C5ZndMXdLJa/qNacNLCDBw/O8nFUNWxp/64+tWAwBefe1tHKg7CgC4/9d3ori4EHv3HcDrb26PqVt2602ovvaHaGlpw+8ffSamLqXYmya8jG8mpFy6iGLkWLh4HAwG4+r6j4VBfaPpLgU8IMGO9MLqW2pYQ9aQokuR5dgXIwCC1CUcNMj3hpdvLAdSF54EYpCHooRA0Swomo2pC0kCQpIAkqTA6LmYupgxL0X7m78+aG10NXVkpIwxsAwWXncDCESHLkohfPbpbiT6ZFPPZQ9fC0e58Wi6wTDj6UbT/rQAyiERS2pW4Kc3LQDLRO8miCEAKj7d83FcTxyLJJJJ+9MCqKoq9HomMrgkSThxsgEcZ8AMpwMkSYJlKDA0DVUFiHGWRDJp/4jXwqIo4uFHnkZXdw8AYGbZFXhs3WqQJDkhkkim7E8KoMlkxKbnn8DBunrwUli3e8/+yOAA0HjmHDq7upGXm5PUoDUr7hmWRB5Zt3FYwoime+vtd/H6G9uGJIxouniSyP6H7v8FystnY80jGzIA0MihsMAKu20aTp3JzFb6WCWRuDUvHwByw8cOhw2FBVaYjNzIAba1e3Hfb9aiq7MTNStuBwAsvr4KO3d9GnmKztIS5EyxTJiVSDT7p04tipx/9MnnYc7ORlu7NzMxsK3di5AkDHgGw2DTC+uHBeGJshJJZL/fxyMQEDKbRAiCQDAoQhBDYBkKNE2j4uqrhpUBoiSBIMZfEhkN+1NeiWSqEB2rlUg69md0JRIQRHy86z8jXsqNVRLJlP0jqgNJXXgAgjbCcONmCHUvQ+44NWG2s/rtH5Mt/ciToo0wLH4JBGO6LLazRiJk2vBYy4gHHw/bWSN+LZBKEhkMjzn/CaSiKgQOvJDyFB7L7axUJWNJZDA8IhQA1boPin7KZbMSGfUYyFx9b3hXg/cCsoBA2Z0AoYOaxlcC4+mdyCUDKBzanLFBJ3USyaRMuiSSKZmUSSSTMimTCABUlblRU9kAZ0E39p+eii21c+EL0jHbOwu6sfaWgyjND//U4oP6MmzZnfi79XT7mfQSNi7bh0JzOLG19XBY/89r49pYVebGqhuOosDsh1+gsWV3BXYdd2Q+BlaVuXFv9bHgkSbzk+vfcVRyjHhi47J9cftsXLYf7T36Ix8cLHlo6ydlv6qpPI2qssRZcuOy/Wjp4k5s+2zG+offKqtcUt6kJtNv7S0H0RtkvEufXTB/6bML5je2Wy7UVDbEbF9o9mPDsv2oP5v75vbPS26rP5u3fdXiozDppcwDrKlswOlWy9E//DX09Mt/azh8zzNM1RybF86C7pheVGD240CDeX3NWtfml94Rt+0+Mf3Lm8qbEnpfgdmPs+3G9+564vTT//pM/GrHYduWRP0AYOEMN/5S61xT92Vtfd2XtfWb/vu91fHALyxzw9tnkB/cTD5w+2Ou9375HHtfa7exM5mxRpKFaafdQQKgAcDERs98/foLHrXdaXfoABi8vczhWO2/28/TRR5z2h00gKymNl1ton79oigq6bQ7dE67Q+ew9mb1h4FYYwVESgLAXLSRa+3mWpIdK+UYuPiq89f8+XfT/+ftZQ4vLm9ZmUyfdcsv1M2fWfRaUCK8i8vdK1u6ktuAWPWTsztm24o/cnnYHUsrWzd1+fVJ9XtqxbG3XzFdNcPTawjcueibpxK1t+X26f/9R8a953jub4typOvm2b1XnvUmv8JKWMZcaZffX3XDERRP8cGaFRjWxtPLoZvXY4oxgPBNEsgxBhCUKEzL6Ru+JydS8Ak0giKFgESDJFQoKmCgQzAwIfQEWETzmoBIwd2VNaStu8uEHGO4Buz06zHHFv0dRkefAZ1+PQx0KNK2eIoPLCUj2zDc275qzgcBFWv+cf3IyxgTK2KOzQufEM5kfpGF12eGPSf8DXN+No/87HDWiwYYALw+M6ym8AscAxO++X7xCTRM7EDQzht0Da8v/NWo1dQDAxNCocUXs+303IGHdaptOmYXnh/SLlZbV+fwnwJm6UXEm/ojqgM/PFmJQ81OPHfrtqT7bN23BE8seTflYLvz5DwYGQHLKz5Puo/XZ8aLtT+D1dSDuxbsGQIymmz48DbwIguOESJOcce8XaO3oVpZ8k3Em5KVVAAMFnuOB9as1MbimCBunn04vBmR40ls29Wfgxf1KMn1gBdY+MXUCvK4ANvPndpLzrLzALjBN2VPwrDBksgLYkn1jBMp90nVY2++8vAw3RlPeLNYVZSPAEgjKWP6ZCn4lF+gMdnE08spQb73RQB9aXtgo6tJcNodf8rWz3L//Br340UW3sExEkXrFFKSSUVHqkRfkJZ8QSZk5gS6hw9H+GyDQAclSs41BVmSUIn+toAKIUTJskKoQUknCxKlkISKb/sM0NMyyVAhXW+AlYosfgOgQlUJVadTSUWBKoQoudvPioPbenq5oIUTaRUqenhWKi3oyVIUqKpKREoLggDhF6hQb4CV9LRM9rctMPN6glChp2SdTqeSskwoAECSKnG61fzFR/XsGu+FhmONriYl7TImsjoYKJyZSeB8CoBQo6spqU8TCO1fgE7gDVUNoCYaQA2gBlADqAHURAOoAdQAagA10QCOgfwfNp/hXbfBMCAAAAAASUVORK5CYII='; +const blockIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAACXBIWXMAABYlAAAWJQFJUiTwAAAChVBMVEX///8jHyAjHyAjHyAjHyAjHyAjHyAjHyAjHyAjHyAjHyAjHyA5UHZxXSY1OEJvXCY4O0eNcyc/X5GKcCc7P0yFbSY6PkqmhB9eVj9+ai5cVD6WeiaUeCasiB9wYjhXUkSggSVDa6aegCQ9QlFtYDs+Q1KmhSO0jh6RmrKtiiHAlhm0jh9ARVW2kB+7kx2aorjFmhiVnbXCmBrToxNJgdFBR1asiiVJg9bCmRvbqBCRmrLYphFBR1fgqw7irA1zZ0DWpRPmrwvnsArosAuUnLThrA3sswjsswnutAfvtQfwtga6lB/ytwbqsgn2uQT4ugPdqg/psQr5uwL5uwP6vAL1uAX7vAL7vQI5PUk7P009QlA+Q1E/RFM/RFRARVRBR1dCR1dCTGJCUWxDUWxDVndEW4FEYIxFSlpFYpFFZZZFZ5pGaqFHb6tHdLZITFpIecBIfMZJfstJgdBJg9VJhNhKTl1KUF5LUWBLjepLjetLkO9LkfJLkfNLkvVMiuNMl/9NT1JNU2JNhdZNh9tNiN5Nk/ZQgstSV2ZSerpUbJdUcKBVW2lWYX1XXnVZVkxZXmxgZXJhZG5lXkdpbXlqb3txZUFzd4J2cF95fYh9bTyAh5qAh5uBdliFjKCGjJ+JdDaTmq2UfDGborOcn6afoqiggyugiEKlp6ynqrCrjjusiyavsLaxt8a1lDO1t7y4kiC/wcXAmizEmhvFxcjFx8rJys3KoSXLz9fMzdDPoRbQoRXQ0dTS1NbVpx3ZpxHZpxLbqBHcqRDc3eDfrRbf4eTg4eLh4uPirA3jrQ3k5ebm5+josAvpsQrqsgnqsw/rsgnxtgbzuAX0uAX0uQf09PX2uQT/vwCQ+pAlAAAAWHRSTlMAAgMFBwoLDQ8QFBUzMzQ0REpNTVBQU1dbW11maG92eXx+fn+CjZOcoKamt7jDxsjN0NPX2uPj6ert7/Hy9PT19fb29vf3+Pj5+fn6+vz8/P39/f39/v7+zND1kwAAA6hJREFUeNrt2OlbTFEcwPE7YyxF9n1fs4fsy9ijkKGkZPkJ155Bliy52SO0KIlEKRqEEnKpTEW6qbQ4f4+Ze87M7c6985xnmt6Z74tzz3me83yeO/2aXsR48uTpf2nWotVvxBatntQh4IzP9lwANT3mcG07iR9G6xK3DygtmeDlCHadL/OMLH4A9uiN0zmAfeUesPgB2KM31/EVx8g9YPEDiEfP2xlIIBY/gObRQQKx+AFWj42OPiq2pz0ggVgj2DrEcediLMXhj+8qSKAosBfHHbK+WtTeaO6ESyDxFHEccBYx2shyMS6Dkuf2Gyo893+GxFO2/0SMmFHu0UGlR+/glauxsRcOq4Dt8+DI7VscdwpUQOy5DiYkiJ4SVPXS0s4CJKclkiUxLZksEshhTwEOBLUE4SFAqVBAlgKhlCwSKHougA8ASoQ8suQJJWSRQOKpgztxu8BWRMQOgG0RkWSJjNiGF5J0Xx08/SRb7PFuoCe7rw5uf1YtiFU/2kUfivy+KhiZKwg/376vFYTsnfShyO87A3/cBLhfi0HaUKT76uDlype5wnMAOPANg9ShREr3X1deVoBJrR9kIC0J/Chkf21NUoCQdEz2EShDkX/kM0kdPRTqrw19KPL71F9s+lBk9+lfPXr0r55Y1EXWlT9fJOdg1HkOg9Sh0EHiEZA6FDqIvYTrGKQOhQ6K3vU7NwhIjw4ePx976eq1fR02FEXuDkWRu0NR5O5QXI4OZvLN7+IBl2pG6BWA6imer6vjbRcz61DzU3UwM2Csjz8PuLqZI4ahTLCd/Ef7hNlPxQt69pyXD2L30MRBU5rjVUHeT8N0Q6n4lVAfRudXDEBOoxmtr+0EaDDD9DeDWE5wZ6bLwhwnoE7jjdLBWjry0Xr58gDk1K+T1wDeDg7VaociEMsP8NJ2989XB5Gfb7Ad3Ow7NlgCw6YOD5DATeNHrbeBaPnwyWFqYCpfj6z9rqgvr2j8Je7/1tdUfC+vaTTjk3XL19TwSKyx3LKt/yPuv/BKMB01oZYqJNWAH03k1IC3uDJkr8qaGamDpgwklSUDX5jwFuspGXYy5W5KVpYzsKoISZXJwKKyNmCLydSCSIWmT0WFKqD3MnxfUZNyq8yMpnVzAHUjm90BN/fWMA51HjJ77catG0PX6IP0+sAVoZZtyIaglfql+lWB+tAQQ3jIBut28aqVi8NDDAZDaKDesg1aZwg3GLZM79WJUaTRdW1vXXSe/x158uSJ0j/jGCbCo03iNQAAAABJRU5ErkJggg=='; /** * Enum for micro:bit BLE command protocol. diff --git a/src/extensions/scratch3_music/index.js b/src/extensions/scratch3_music/index.js index 7aea640d8b7..5a4b226f4c5 100644 --- a/src/extensions/scratch3_music/index.js +++ b/src/extensions/scratch3_music/index.js @@ -22,14 +22,14 @@ try { * @type {string} */ // eslint-disable-next-line max-len -const blockIconURI = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+PHRpdGxlPm11c2ljLWJsb2NrLWljb248L3RpdGxlPjxkZWZzPjxwYXRoIGQ9Ik0zMi4xOCAyNS44NzRDMzIuNjM2IDI4LjE1NyAzMC41MTIgMzAgMjcuNDMzIDMwYy0zLjA3IDAtNS45MjMtMS44NDMtNi4zNzItNC4xMjYtLjQ1OC0yLjI4NSAxLjY2NS00LjEzNiA0Ljc0My00LjEzNi42NDcgMCAxLjI4My4wODQgMS44OS4yMzQuMzM4LjA4Ni42MzcuMTguOTM4LjMwMi44Ny0uMDItLjEwNC0yLjI5NC0xLjgzNS0xMi4yMy0yLjEzNC0xMi4zMDIgMy4wNi0xLjg3IDguNzY4LTIuNzUyIDUuNzA4LS44ODUuMDc2IDQuODItMy42NSAzLjg0NC0zLjcyNC0uOTg3LTQuNjUtNy4xNTMuMjYzIDE0LjczOHptLTE2Ljk5OCA1Ljk5QzE1LjYzIDM0LjE0OCAxMy41MDcgMzYgMTAuNDQgMzZjLTMuMDcgMC01LjkyMi0xLjg1Mi02LjM4LTQuMTM2LS40NDgtMi4yODQgMS42NzQtNC4xMzUgNC43NS00LjEzNSAxLjAwMyAwIDEuOTc1LjE5NiAyLjg1NS41NDMuODIyLS4wNTUtLjE1LTIuMzc3LTEuODYyLTEyLjIyOC0yLjEzMy0xMi4zMDMgMy4wNi0xLjg3IDguNzY0LTIuNzUzIDUuNzA2LS44OTQuMDc2IDQuODItMy42NDggMy44MzQtMy43MjQtLjk4Ny00LjY1LTcuMTUyLjI2MiAxNC43Mzh6IiBpZD0iYSIvPjwvZGVmcz48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjx1c2UgZmlsbD0iI0ZGRiIgeGxpbms6aHJlZj0iI2EiLz48cGF0aCBzdHJva2Utb3BhY2l0eT0iLjEiIHN0cm9rZT0iIzAwMCIgZD0iTTI4LjQ1NiAyMS42NzVjLS4wMS0uMzEyLS4wODctLjgyNS0uMjU2LTEuNzAyLS4wOTYtLjQ5NS0uNjEyLTMuMDIyLS43NTMtMy43My0uMzk1LTEuOTgtLjc2LTMuOTItMS4xNDItNi4xMTMtLjczMi00LjIyMy0uNjkzLTYuMDUuMzQ0LTYuNTI3LjUtLjIzIDEuMDYtLjA4IDEuODQuMzUuNDE0LjIyNyAyLjE4MiAxLjM2NSAyLjA3IDEuMjk2IDEuOTk0IDEuMjQyIDMuNDY0IDEuNzc0IDQuOTMgMS41NDggMS41MjYtLjIzNyAyLjUwNC0uMDYgMi44NzYuNjE4LjM0OC42MzUuMDE1IDEuNDE2LS43MyAyLjE4LTEuNDcyIDEuNTE2LTMuOTc1IDIuNTE0LTUuODQ4IDIuMDIzLS44MjItLjIyLTEuMjM4LS40NjUtMi4zOC0xLjI2N2wtLjA5NS0uMDY2Yy4wNDcuNTkzLjI2NCAxLjc0LjcxNyAzLjgwMy4yOTQgMS4zMzYgMi4wOCA5LjE4NyAyLjYzNyAxMS42NzRsLjAwMi4wMTJjLjUyOCAyLjYzNy0xLjg3MyA0LjcyNC01LjIzNiA0LjcyNC0zLjI5IDAtNi4zNjMtMS45ODgtNi44NjItNC41MjgtLjUzLTIuNjQgMS44NzMtNC43MzQgNS4yMzMtNC43MzQuNjcyIDAgMS4zNDcuMDg1IDIuMDE0LjI1LjIyNy4wNTcuNDM2LjExOC42MzYuMTg3em0tMTYuOTk2IDUuOTljLS4wMS0uMzE4LS4wOS0uODM4LS4yNjYtMS43MzctLjA5LS40Ni0uNTk1LTIuOTM3LS43NTMtMy43MjctLjM5LTEuOTYtLjc1LTMuODktMS4xMy02LjA3LS43MzItNC4yMjMtLjY5Mi02LjA1LjM0NC02LjUyNi41MDItLjIzIDEuMDYtLjA4MiAxLjg0LjM1LjQxNS4yMjcgMi4xODIgMS4zNjQgMi4wNyAxLjI5NSAxLjk5MyAxLjI0MiAzLjQ2MiAxLjc3NCA0LjkyNiAxLjU0OCAxLjUyNS0uMjQgMi41MDQtLjA2NCAyLjg3Ni42MTQuMzQ4LjYzNS4wMTUgMS40MTUtLjcyOCAyLjE4LTEuNDc0IDEuNTE3LTMuOTc3IDIuNTEzLTUuODQ3IDIuMDE3LS44Mi0uMjItMS4yMzYtLjQ2NC0yLjM3OC0xLjI2N2wtLjA5NS0uMDY1Yy4wNDcuNTkzLjI2NCAxLjc0LjcxNyAzLjgwMi4yOTQgMS4zMzcgMi4wNzggOS4xOSAyLjYzNiAxMS42NzVsLjAwMy4wMTNjLjUxNyAyLjYzOC0xLjg4NCA0LjczMi01LjIzNCA0LjczMi0zLjI4NyAwLTYuMzYtMS45OTMtNi44Ny00LjU0LS41Mi0yLjY0IDEuODg0LTQuNzMgNS4yNC00LjczLjkwNSAwIDEuODAzLjE1IDIuNjUuNDM2eiIvPjwvZz48L3N2Zz4='; +const blockIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHRpdGxlPm11c2ljLWJsb2NrLWljb248L3RpdGxlPjxkZWZzPjxwYXRoIGlkPSJhIiBkPSJNMzIuMTggMjUuODc0QzMyLjYzNiAyOC4xNTcgMzAuNTEyIDMwIDI3LjQzMyAzMGMtMy4wNyAwLTUuOTIzLTEuODQzLTYuMzcyLTQuMTI2LS40NTgtMi4yODUgMS42NjUtNC4xMzYgNC43NDMtNC4xMzZhOCA4IDAgMCAxIDEuODkuMjM0Yy4zMzguMDg2LjYzNy4xOC45MzguMzAyLjg3LS4wMi0uMTA0LTIuMjk0LTEuODM1LTEyLjIzLTIuMTM0LTEyLjMwMiAzLjA2LTEuODcgOC43NjgtMi43NTIgNS43MDgtLjg4NS4wNzYgNC44Mi0zLjY1IDMuODQ0LTMuNzI0LS45ODctNC42NS03LjE1My4yNjMgMTQuNzM4em0tMTYuOTk4IDUuOTlDMTUuNjMgMzQuMTQ4IDEzLjUwNyAzNiAxMC40NCAzNmMtMy4wNyAwLTUuOTIyLTEuODUyLTYuMzgtNC4xMzYtLjQ0OC0yLjI4NCAxLjY3NC00LjEzNSA0Ljc1LTQuMTM1IDEuMDAzIDAgMS45NzUuMTk2IDIuODU1LjU0My44MjItLjA1NS0uMTUtMi4zNzctMS44NjItMTIuMjI4LTIuMTMzLTEyLjMwMyAzLjA2LTEuODcgOC43NjQtMi43NTMgNS43MDYtLjg5NC4wNzYgNC44Mi0zLjY0OCAzLjgzNHMtNC42NS03LjE1Mi4yNjIgMTQuNzM4eiIvPjwvZGVmcz48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjx1c2UgeGxpbms6aHJlZj0iI2EiIGZpbGw9IiNmZmYiLz48cGF0aCBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIuMSIgZD0iTTI4LjQ1NiAyMS42NzVjLS4wMS0uMzEyLS4wODctLjgyNS0uMjU2LTEuNzAyLS4wOTYtLjQ5NS0uNjEyLTMuMDIyLS43NTMtMy43My0uMzk1LTEuOTgtLjc2LTMuOTItMS4xNDItNi4xMTMtLjczMi00LjIyMy0uNjkzLTYuMDUuMzQ0LTYuNTI3LjUtLjIzIDEuMDYtLjA4IDEuODQuMzUuNDE0LjIyNyAyLjE4MiAxLjM2NSAyLjA3IDEuMjk2IDEuOTk0IDEuMjQyIDMuNDY0IDEuNzc0IDQuOTMgMS41NDggMS41MjYtLjIzNyAyLjUwNC0uMDYgMi44NzYuNjE4LjM0OC42MzUuMDE1IDEuNDE2LS43MyAyLjE4LTEuNDcyIDEuNTE2LTMuOTc1IDIuNTE0LTUuODQ4IDIuMDIzLS44MjItLjIyLTEuMjM4LS40NjUtMi4zOC0xLjI2N2wtLjA5NS0uMDY2Yy4wNDcuNTkzLjI2NCAxLjc0LjcxNyAzLjgwMy4yOTQgMS4zMzYgMi4wOCA5LjE4NyAyLjYzNyAxMS42NzRsLjAwMi4wMTJjLjUyOCAyLjYzNy0xLjg3MyA0LjcyNC01LjIzNiA0LjcyNC0zLjI5IDAtNi4zNjMtMS45ODgtNi44NjItNC41MjgtLjUzLTIuNjQgMS44NzMtNC43MzQgNS4yMzMtNC43MzRhOC40IDguNCAwIDAgMSAyLjY1LjQzN3ptLTE2Ljk5NiA1Ljk5Yy0uMDEtLjMxOC0uMDktLjgzOC0uMjY2LTEuNzM3LS4wOS0uNDYtLjU5NS0yLjkzNy0uNzUzLTMuNzI3LS4zOS0xLjk2LS43NS0zLjg5LTEuMTMtNi4wNy0uNzMyLTQuMjIzLS42OTItNi4wNS4zNDQtNi41MjYuNTAyLS4yMyAxLjA2LS4wODIgMS44NC4zNS40MTUuMjI3IDIuMTgyIDEuMzY0IDIuMDcgMS4yOTUgMS45OTMgMS4yNDIgMy40NjIgMS43NzQgNC45MjYgMS41NDggMS41MjUtLjI0IDIuNTA0LS4wNjQgMi44NzYuNjE0LjM0OC42MzUuMDE1IDEuNDE1LS43MjggMi4xOC0xLjQ3NCAxLjUxNy0zLjk3NyAyLjUxMy01Ljg0NyAyLjAxNy0uODItLjIyLTEuMjM2LS40NjQtMi4zNzgtMS4yNjdsLS4wOTUtLjA2NWMuMDQ3LjU5My4yNjQgMS43NC43MTcgMy44MDIuMjk0IDEuMzM3IDIuMDc4IDkuMTkgMi42MzYgMTEuNjc1bC4wMDMuMDEzYy41MTcgMi42MzgtMS44ODQgNC43MzItNS4yMzQgNC43MzItMy4yODcgMC02LjM2LTEuOTkzLTYuODctNC41NC0uNTItMi42NCAxLjg4NC00LjczIDUuMjQtNC43My45MDUgMCAxLjgwMy4xNSAyLjY1LjQzNnoiLz48L2c+PC9zdmc+'; /** * Icon svg to be displayed in the category menu, encoded as a data URI. * @type {string} */ // eslint-disable-next-line max-len -const menuIconURI = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTE2LjA5IDEyLjkzN2MuMjI4IDEuMTQxLS44MzMgMi4wNjMtMi4zNzMgMi4wNjMtMS41MzUgMC0yLjk2Mi0uOTIyLTMuMTg2LTIuMDYzLS4yMy0xLjE0Mi44MzMtMi4wNjggMi4zNzItMi4wNjguMzIzIDAgLjY0MS4wNDIuOTQ1LjExN2EzLjUgMy41IDAgMCAxIC40NjguMTUxYy40MzUtLjAxLS4wNTItMS4xNDctLjkxNy02LjExNC0xLjA2Ny02LjE1MiAxLjUzLS45MzUgNC4zODQtMS4zNzcgMi44NTQtLjQ0Mi4wMzggMi40MS0xLjgyNSAxLjkyMi0xLjg2Mi0uNDkzLTIuMzI1LTMuNTc3LjEzMiA3LjM3ek03LjQ2IDguNTYzYy0xLjg2Mi0uNDkzLTIuMzI1LTMuNTc2LjEzIDcuMzdDNy44MTYgMTcuMDczIDYuNzU0IDE4IDUuMjIgMThjLTEuNTM1IDAtMi45NjEtLjkyNi0zLjE5LTIuMDY4LS4yMjQtMS4xNDIuODM3LTIuMDY3IDIuMzc1LTIuMDY3LjUwMSAwIC45ODcuMDk4IDEuNDI3LjI3Mi40MTItLjAyOC0uMDc0LTEuMTg5LS45My02LjExNEMzLjgzNCAxLjg3IDYuNDMgNy4wODcgOS4yODIgNi42NDZjMi44NTQtLjQ0Ny4wMzggMi40MS0xLjgyMyAxLjkxN3oiIGZpbGw9IiM1NzVFNzUiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg=='; +const menuIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+PHBhdGggZmlsbD0iIzU3NWU3NSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTYuMDkgMTIuOTM3Yy4yMjggMS4xNDEtLjgzMyAyLjA2My0yLjM3MyAyLjA2My0xLjUzNSAwLTIuOTYyLS45MjItMy4xODYtMi4wNjMtLjIzLTEuMTQyLjgzMy0yLjA2OCAyLjM3Mi0yLjA2OC4zMjMgMCAuNjQxLjA0Mi45NDUuMTE3YTMuNSAzLjUgMCAwIDEgLjQ2OC4xNTFjLjQzNS0uMDEtLjA1Mi0xLjE0Ny0uOTE3LTYuMTE0LTEuMDY3LTYuMTUyIDEuNTMtLjkzNSA0LjM4NC0xLjM3N3MuMDM4IDIuNDEtMS44MjUgMS45MjJjLTEuODYyLS40OTMtMi4zMjUtMy41NzcuMTMyIDcuMzd6TTcuNDYgOC41NjNjLTEuODYyLS40OTMtMi4zMjUtMy41NzYuMTMgNy4zN0M3LjgxNiAxNy4wNzMgNi43NTQgMTggNS4yMiAxOHMtMi45NjEtLjkyNi0zLjE5LTIuMDY4Yy0uMjI0LTEuMTQyLjgzNy0yLjA2NyAyLjM3NS0yLjA2Ny41MDEgMCAuOTg3LjA5OCAxLjQyNy4yNzIuNDEyLS4wMjgtLjA3NC0xLjE4OS0uOTMtNi4xMTQtMS4wNjgtNi4xNTMgMS41MjgtLjkzNiA0LjM4LTEuMzc3IDIuODU0LS40NDcuMDM4IDIuNDEtMS44MjMgMS45MTd6Ii8+PC9zdmc+'; /** * Class for the music-related blocks in Scratch 3.0 diff --git a/src/extensions/scratch3_pen/index.js b/src/extensions/scratch3_pen/index.js index 20575d950bd..7e103dd86cf 100644 --- a/src/extensions/scratch3_pen/index.js +++ b/src/extensions/scratch3_pen/index.js @@ -14,7 +14,7 @@ const StageLayering = require('../../engine/stage-layering'); * @type {string} */ // eslint-disable-next-line max-len -const blockIconURI = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+cGVuLWljb248L3RpdGxlPjxnIHN0cm9rZT0iIzU3NUU3NSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik04Ljc1MyAzNC42MDJsLTQuMjUgMS43OCAxLjc4My00LjIzN2MxLjIxOC0yLjg5MiAyLjkwNy01LjQyMyA1LjAzLTcuNTM4TDMxLjA2NiA0LjkzYy44NDYtLjg0MiAyLjY1LS40MSA0LjAzMi45NjcgMS4zOCAxLjM3NSAxLjgxNiAzLjE3My45NyA0LjAxNUwxNi4zMTggMjkuNTljLTIuMTIzIDIuMTE2LTQuNjY0IDMuOC03LjU2NSA1LjAxMiIgZmlsbD0iI0ZGRiIvPjxwYXRoIGQ9Ik0yOS40MSA2LjExcy00LjQ1LTIuMzc4LTguMjAyIDUuNzcyYy0xLjczNCAzLjc2Ni00LjM1IDEuNTQ2LTQuMzUgMS41NDYiLz48cGF0aCBkPSJNMzYuNDIgOC44MjVjMCAuNDYzLS4xNC44NzMtLjQzMiAxLjE2NGwtOS4zMzUgOS4zYy4yODItLjI5LjQxLS42NjguNDEtMS4xMiAwLS44NzQtLjUwNy0xLjk2My0xLjQwNi0yLjg2OC0xLjM2Mi0xLjM1OC0zLjE0Ny0xLjgtNC4wMDItLjk5TDMwLjk5IDUuMDFjLjg0NC0uODQgMi42NS0uNDEgNC4wMzUuOTYuODk4LjkwNCAxLjM5NiAxLjk4MiAxLjM5NiAyLjg1NU0xMC41MTUgMzMuNzc0Yy0uNTczLjMwMi0xLjE1Ny41Ny0xLjc2NC44M0w0LjUgMzYuMzgybDEuNzg2LTQuMjM1Yy4yNTgtLjYwNC41My0xLjE4Ni44MzMtMS43NTcuNjkuMTgzIDEuNDQ4LjYyNSAyLjEwOCAxLjI4Mi42Ni42NTggMS4xMDIgMS40MTIgMS4yODcgMi4xMDIiIGZpbGw9IiM0Qzk3RkYiLz48cGF0aCBkPSJNMzYuNDk4IDguNzQ4YzAgLjQ2NC0uMTQuODc0LS40MzMgMS4xNjVsLTE5Ljc0MiAxOS42OGMtMi4xMyAyLjExLTQuNjczIDMuNzkzLTcuNTcyIDUuMDFMNC41IDM2LjM4bC45NzQtMi4zMTYgMS45MjUtLjgwOGMyLjg5OC0xLjIxOCA1LjQ0LTIuOSA3LjU3LTUuMDFsMTkuNzQzLTE5LjY4Yy4yOTItLjI5Mi40MzItLjcwMi40MzItMS4xNjUgMC0uNjQ2LS4yNy0xLjQtLjc4LTIuMTIyLjI1LjE3Mi41LjM3Ny43MzcuNjE0Ljg5OC45MDUgMS4zOTYgMS45ODMgMS4zOTYgMi44NTYiIGZpbGw9IiM1NzVFNzUiIG9wYWNpdHk9Ii4xNSIvPjxwYXRoIGQ9Ik0xOC40NSAxMi44M2MwIC41LS40MDQuOTA1LS45MDQuOTA1cy0uOTA1LS40MDUtLjkwNS0uOTA0YzAtLjUuNDA3LS45MDMuOTA2LS45MDMuNSAwIC45MDQuNDA0LjkwNC45MDR6IiBmaWxsPSIjNTc1RTc1Ii8+PC9nPjwvc3ZnPg=='; +const blockIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgdmlld0JveD0iMCAwIDQwIDQwIj48dGl0bGU+cGVuLWljb248L3RpdGxlPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlPSIjNTc1ZTc1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Im04Ljc1MyAzNC42MDItNC4yNSAxLjc4IDEuNzgzLTQuMjM3YzEuMjE4LTIuODkyIDIuOTA3LTUuNDIzIDUuMDMtNy41MzhMMzEuMDY2IDQuOTNjLjg0Ni0uODQyIDIuNjUtLjQxIDQuMDMyLjk2NyAxLjM4IDEuMzc1IDEuODE2IDMuMTczLjk3IDQuMDE1TDE2LjMxOCAyOS41OWMtMi4xMjMgMi4xMTYtNC42NjQgMy44LTcuNTY1IDUuMDEyIi8+PHBhdGggZD0iTTI5LjQxIDYuMTFzLTQuNDUtMi4zNzgtOC4yMDIgNS43NzJjLTEuNzM0IDMuNzY2LTQuMzUgMS41NDYtNC4zNSAxLjU0NiIvPjxwYXRoIGZpbGw9IiM0Yzk3ZmYiIGQ9Ik0zNi40MiA4LjgyNWMwIC40NjMtLjE0Ljg3My0uNDMyIDEuMTY0bC05LjMzNSA5LjNjLjI4Mi0uMjkuNDEtLjY2OC40MS0xLjEyIDAtLjg3NC0uNTA3LTEuOTYzLTEuNDA2LTIuODY4LTEuMzYyLTEuMzU4LTMuMTQ3LTEuOC00LjAwMi0uOTlMMzAuOTkgNS4wMWMuODQ0LS44NCAyLjY1LS40MSA0LjAzNS45Ni44OTguOTA0IDEuMzk2IDEuOTgyIDEuMzk2IDIuODU1TTEwLjUxNSAzMy43NzRhMjQgMjQgMCAwIDEtMS43NjQuODNMNC41IDM2LjM4MmwxLjc4Ni00LjIzNWMuMjU4LS42MDQuNTMtMS4xODYuODMzLTEuNzU3LjY5LjE4MyAxLjQ0OC42MjUgMi4xMDggMS4yODIuNjYuNjU4IDEuMTAyIDEuNDEyIDEuMjg3IDIuMTAyIi8+PHBhdGggZmlsbD0iIzU3NWU3NSIgZD0iTTM2LjQ5OCA4Ljc0OGMwIC40NjQtLjE0Ljg3NC0uNDMzIDEuMTY1bC0xOS43NDIgMTkuNjhjLTIuMTMgMi4xMS00LjY3MyAzLjc5My03LjU3MiA1LjAxTDQuNSAzNi4zOGwuOTc0LTIuMzE2IDEuOTI1LS44MDhjMi44OTgtMS4yMTggNS40NC0yLjkgNy41Ny01LjAxbDE5Ljc0My0xOS42OGMuMjkyLS4yOTIuNDMyLS43MDIuNDMyLTEuMTY1IDAtLjY0Ni0uMjctMS40LS43OC0yLjEyMi4yNS4xNzIuNS4zNzcuNzM3LjYxNC44OTguOTA1IDEuMzk2IDEuOTgzIDEuMzk2IDIuODU2IiBvcGFjaXR5PSIuMTUiLz48cGF0aCBmaWxsPSIjNTc1ZTc1IiBkPSJNMTguNDUgMTIuODNhLjkwNC45MDQgMCAxIDEtLjkwMy0uOTAyYy41IDAgLjkwNC40MDQuOTA0LjkwNHoiLz48L2c+PC9zdmc+'; /** * Enum for pen color parameter values. @@ -167,10 +167,14 @@ class Scratch3PenBlocks { * @private */ _getPenLayerID () { - if (this._penSkinId < 0 && this.runtime.renderer) { - this._penSkinId = this.runtime.renderer.createPenSkin(); - this._penDrawableId = this.runtime.renderer.createDrawable(StageLayering.PEN_LAYER); - this.runtime.renderer.updateDrawableSkinId(this._penDrawableId, this._penSkinId); + const renderer = this.runtime.renderer; + if (this._penSkinId < 0 && renderer) { + this._penSkinId = renderer.createPenSkin(); + this._penDrawableId = renderer.createDrawable(StageLayering.PEN_LAYER); + if (renderer.markDrawableAsNoninteractive) { + renderer.markDrawableAsNoninteractive(this._penDrawableId); + } + renderer.updateDrawableSkinId(this._penDrawableId, this._penSkinId); } return this._penSkinId; } diff --git a/src/extensions/scratch3_speech2text/index.js b/src/extensions/scratch3_speech2text/index.js index b42e7f8c1fa..79b5ac1e012 100644 --- a/src/extensions/scratch3_speech2text/index.js +++ b/src/extensions/scratch3_speech2text/index.js @@ -11,7 +11,7 @@ const DiffMatchPatch = require('diff-match-patch'); * @type {string} */ // eslint-disable-next-line max-len -const iconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSIjRkZGRkZGIj48cGF0aCBkPSJNMTIgMTRjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNWMwLTEuNjYtMS4zNC0zLTMtM1M5IDMuMzQgOSA1djZjMCAxLjY2IDEuMzQgMyAzIDN6bTUuMy0zYzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxNCA2LjcgMTFINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMWgydi0zLjI4YzMuMjgtLjQ4IDYtMy4zIDYtNi43MmgtMS43eiIvPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48L3N2Zz4K'; +const iconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0iI2ZmZiIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTIgMTRjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNWMwLTEuNjYtMS4zNC0zLTMtM1M5IDMuMzQgOSA1djZjMCAxLjY2IDEuMzQgMyAzIDNtNS4zLTNjMCAzLTIuNTQgNS4xLTUuMyA1LjFTNi43IDE0IDYuNyAxMUg1YzAgMy40MSAyLjcyIDYuMjMgNiA2LjcyVjIxaDJ2LTMuMjhjMy4yOC0uNDggNi0zLjMgNi02LjcyeiIvPjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L3N2Zz4='; /** @@ -19,7 +19,7 @@ const iconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vc * @type {string} */ // eslint-disable-next-line max-len -const menuIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzc1NzU3NSI+CiAgICA8cGF0aCBkPSJNMTIgMTRjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNWMwLTEuNjYtMS4zNC0zLTMtM1M5IDMuMzQgOSA1djZjMCAxLjY2IDEuMzQgMyAzIDN6bTUuMy0zYzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxNCA2LjcgMTFINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMWgydi0zLjI4YzMuMjgtLjQ4IDYtMy4zIDYtNi43MmgtMS43eiIvPgogICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgo8L3N2Zz4K'; +const menuIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0iIzc1NzU3NSIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTIgMTRjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNWMwLTEuNjYtMS4zNC0zLTMtM1M5IDMuMzQgOSA1djZjMCAxLjY2IDEuMzQgMyAzIDNtNS4zLTNjMCAzLTIuNTQgNS4xLTUuMyA1LjFTNi43IDE0IDYuNyAxMUg1YzAgMy40MSAyLjcyIDYuMjMgNiA2LjcyVjIxaDJ2LTMuMjhjMy4yOC0uNDggNi0zLjMgNi02LjcyeiIvPjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L3N2Zz4='; /** diff --git a/src/extensions/scratch3_text2speech/index.js b/src/extensions/scratch3_text2speech/index.js index b48cf0dbb2c..57bce01085b 100644 --- a/src/extensions/scratch3_text2speech/index.js +++ b/src/extensions/scratch3_text2speech/index.js @@ -14,14 +14,14 @@ const {fetchWithTimeout} = require('../../util/fetch-with-timeout'); * @type {string} */ // eslint-disable-next-line max-len -const menuIconURI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5FeHRlbnNpb25zL1NvZnR3YXJlL1RleHQtdG8tU3BlZWNoLU1lbnU8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iRXh0ZW5zaW9ucy9Tb2Z0d2FyZS9UZXh0LXRvLVNwZWVjaC1NZW51IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0idGV4dDJzcGVlY2giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuMDAwMDAwLCAyLjAwMDAwMCkiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01Ljc1LDguODM0NjcxNzMgQzUuNzUsOC4zMjY5NjM0NCA1LjAwMzAwNzI3LDguMDQyMjEzNzEgNC41NTYyODAxMiw4LjQ0NDE0OTk5IEwzLjIwNjI4MDEyLDkuNTI1MzU3MDIgQzIuNjk2NzMzNzgsOS45MzM0NDk2OCAyLjAzNzQ4Njc1LDEwLjE2NTg3ODggMS4zNSwxMC4xNjU4Nzg4IEwxLjE1LDEwLjE2NTg3ODggQzAuNjMyNTk2MTY1LDEwLjE2NTg3ODggMC4yNSwxMC41MTA2MDAyIDAuMjUsMTAuOTUyMDM1NSBMMC4yNSwxMy4wNjkzOTkzIEMwLjI1LDEzLjUxMDgzNDYgMC42MzI1OTYxNjUsMTMuODU1NTU2IDEuMTUsMTMuODU1NTU2IEwxLjM1LDEzLjg1NTU1NiBDMi4wNzg3Nzg0MSwxMy44NTU1NTYgMi43MjY4NjE2MSwxNC4wNjY3NjM2IDMuMjU5ODYwNDksMTQuNDk5IEw0LjU1OTIwMTQ3LDE1LjU3OTY2MDggQzUuMDEzMDkyNzYsMTUuOTU0NTM5NiA1Ljc1LDE1LjY3MzYzNDQgNS43NSwxNS4xNDE3MTI4IEw1Ljc1LDguODM0NjcxNzMgWiIgaWQ9InNwZWFrZXIiIHN0cm9rZS1vcGFjaXR5PSIwLjE1IiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMC41IiBmaWxsPSIjNEQ0RDREIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMC43MDQ4MzEzLDggQzkuNzkwNjc0NjgsOS4xMzExNDg0NyA4LjMwNjYxODQsOS43MTQyODU3MSA3LjgzMzMzMzMzLDkuNzE0Mjg1NzEgQzcuODMzMzMzMzMsOS43MTQyODU3MSA3LjUsOS43MTQyODU3MSA3LjUsOS4zODA5NTIzOCBDNy41LDkuMDg1MjI2ODQgOC4wNjIyMDE2OCw4LjkwMTk0MTY0IDguMTg5MDYwNjcsNy41Njc1NDA1OCBDNi44ODk5Njk5MSw2LjkwNjc5MDA1IDYsNS41NTczMjY4MyA2LDQgQzYsMS43OTA4NjEgNy43OTA4NjEsNC4wNTgxMjI1MWUtMTYgMTAsMCBMMTIsMCBDMTQuMjA5MTM5LC00LjA1ODEyMjUxZS0xNiAxNiwxLjc5MDg2MSAxNiw0IEMxNiw2LjIwOTEzOSAxNC4yMDkxMzksOCAxMiw4IEwxMC43MDQ4MzEzLDggWiIgaWQ9InNwZWVjaCIgZmlsbD0iIzBFQkQ4QyI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'; +const menuIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48dGl0bGU+RXh0ZW5zaW9ucy9Tb2Z0d2FyZS9UZXh0LXRvLVNwZWVjaC1NZW51PC90aXRsZT48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9Im5vbnplcm8iPjxwYXRoIGZpbGw9IiM0ZDRkNGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9Ii4xNSIgc3Ryb2tlLXdpZHRoPSIuNSIgZD0iTTcuNzUgMTAuODM1YzAtLjUwOC0uNzQ3LS43OTMtMS4xOTQtLjM5bC0xLjM1IDEuMDhjLS41MS40MDgtMS4xNjkuNjQtMS44NTYuNjRoLS4yYy0uNTE3IDAtLjkuMzQ2LS45Ljc4N3YyLjExN2MwIC40NDIuMzgzLjc4Ny45Ljc4N2guMmMuNzI5IDAgMS4zNzcuMjEgMS45MS42NDNsMS4zIDEuMDhjLjQ1My4zNzYgMS4xOS4wOTUgMS4xOS0uNDM3eiIvPjxwYXRoIGZpbGw9IiMwZWJkOGMiIGQ9Ik0xMi43MDUgMTBjLS45MTQgMS4xMzEtMi4zOTggMS43MTQtMi44NzIgMS43MTQgMCAwLS4zMzMgMC0uMzMzLS4zMzMgMC0uMjk2LjU2Mi0uNDguNjktMS44MTNBNCA0IDAgMCAxIDEyIDJoMmE0IDQgMCAxIDEgMCA4eiIvPjwvZz48L3N2Zz4='; /** * Icon svg to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} */ // eslint-disable-next-line max-len -const blockIconURI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDAgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5FeHRlbnNpb25zL1NvZnR3YXJlL1RleHQtdG8tU3BlZWNoLUJsb2NrPC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGcgaWQ9IkV4dGVuc2lvbnMvU29mdHdhcmUvVGV4dC10by1TcGVlY2gtQmxvY2siIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1vcGFjaXR5PSIwLjE1Ij4KICAgICAgICA8ZyBpZD0idGV4dDJzcGVlY2giIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQuMDAwMDAwLCA0LjAwMDAwMCkiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjMDAwMDAwIj4KICAgICAgICAgICAgPHBhdGggZD0iTTExLjUsMTcuNjY5MzQzNSBDMTEuNSwxNi42NTM5MjY5IDEwLjAwNjAxNDUsMTYuMDg0NDI3NCA5LjExMjU2MDI0LDE2Ljg4ODMgTDYuNDEyNTYwMjQsMTkuMDUwNzE0IEM1LjM5MzQ2NzU1LDE5Ljg2Njg5OTQgNC4wNzQ5NzM1MSwyMC4zMzE3NTc1IDIuNywyMC4zMzE3NTc1IEwyLjMsMjAuMzMxNzU3NSBDMS4yNjUxOTIzMywyMC4zMzE3NTc1IDAuNSwyMS4wMjEyMDAzIDAuNSwyMS45MDQwNzEgTDAuNSwyNi4xMzg3OTg2IEMwLjUsMjcuMDIxNjY5MyAxLjI2NTE5MjMzLDI3LjcxMTExMiAyLjMsMjcuNzExMTEyIEwyLjcsMjcuNzExMTEyIEM0LjE1NzU1NjgyLDI3LjcxMTExMiA1LjQ1MzcyMzIyLDI4LjEzMzUyNzEgNi41MTk3MjA5OCwyOC45OTggTDkuMTE4NDAyOTMsMzEuMTU5MzIxNiBDMTAuMDI2MTg1NSwzMS45MDkwNzkzIDExLjUsMzEuMzQ3MjY4OSAxMS41LDMwLjI4MzQyNTUgTDExLjUsMTcuNjY5MzQzNSBaIiBpZD0ic3BlYWtlciIgZmlsbD0iIzRENEQ0RCI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNMjEuNjQzNjA2NiwxNi41IEMxOS45NzcwMDk5LDE4LjQzNzAyMzQgMTcuMTA1MDI3NSwxOS45Mjg1NzE0IDE1LjY2NjY2NjcsMTkuOTI4NTcxNCBDMTUuNTEyNjM5NywxOS45Mjg1NzE0IDE1LjMxNjYyOTIsMTkuODk1OTAzIDE1LjEwOTcyNjUsMTkuNzkyNDUxNyBDMTQuNzM3NjAzOSwxOS42MDYzOTA0IDE0LjUsMTkuMjQ5OTg0NiAxNC41LDE4Ljc2MTkwNDggQzE0LjUsMTguNjU2ODA0MSAxNC41MTcwNTU1LDE4LjU1NDUwNzYgMTQuNTQ5NDQ2NywxOC40NTQwODQ0IEMxNC42MjU3NTQ1LDE4LjIxNzUwNjMgMTUuMTczNTcyMSwxNy40Njc1MzEgMTUuMjc3MjA3MSwxNy4yODA5ODgxIEMxNS41NDYzNTI2LDE2Ljc5NjUyNjEgMTUuNzM5MDI1LDE2LjIwNjM1NjEgMTUuODQzMjg5MSwxNS40MTYwMDM0IEMxMy4xODk3MDA1LDEzLjkyNjgzNjkgMTEuNSwxMS4xMTM5NjY4IDExLjUsOCBDMTEuNSwzLjMwNTU3OTYzIDE1LjMwNTU3OTYsLTAuNSAyMCwtMC41IEwyNCwtMC41IEMyOC42OTQ0MjA0LC0wLjUgMzIuNSwzLjMwNTU3OTYzIDMyLjUsOCBDMzIuNSwxMi42OTQ0MjA0IDI4LjY5NDQyMDQsMTYuNSAyNCwxNi41IEwyMS42NDM2MDY2LDE2LjUgWiIgaWQ9InNwZWVjaCIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'; +const blockIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgdmlld0JveD0iMCAwIDQwIDQwIj48dGl0bGU+RXh0ZW5zaW9ucy9Tb2Z0d2FyZS9UZXh0LXRvLVNwZWVjaC1CbG9jazwvdGl0bGU+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJub256ZXJvIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIuMTUiPjxwYXRoIGZpbGw9IiM0ZDRkNGQiIGQ9Ik0xNS41IDIxLjY3YzAtMS4wMTYtMS40OTQtMS41ODYtMi4zODctLjc4MmwtMi43IDIuMTYzQTUuOTYgNS45NiAwIDAgMSA2LjcgMjQuMzNoLS40Yy0xLjAzNSAwLTEuOC42OS0xLjggMS41NzN2NC4yMzVjMCAuODgzLjc2NSAxLjU3MiAxLjggMS41NzJoLjRjMS40NTggMCAyLjc1NC40MjMgMy44MiAxLjI4N2wyLjU5OCAyLjE2MWMuOTA4Ljc1IDIuMzgyLjE4OCAyLjM4Mi0uODc2eiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0yNS42NDQgMjAuNWMtMS42NjcgMS45MzctNC41MzkgMy40MjktNS45NzcgMy40MjlhMS4yNSAxLjI1IDAgMCAxLS41NTctLjEzN2MtLjM3Mi0uMTg2LS42MS0uNTQyLS42MS0xLjAzcTAtLjE1Ny4wNS0uMzA4Yy4wNzYtLjIzNi42MjQtLjk4Ni43MjctMS4xNzMuMjctLjQ4NC40NjItMS4wNzUuNTY2LTEuODY1QTguNSA4LjUgMCAwIDEgMjQgMy41aDRhOC41IDguNSAwIDEgMSAwIDE3eiIvPjwvZz48L3N2Zz4='; /** * The url of the synthesis server. diff --git a/src/extensions/scratch3_translate/index.js b/src/extensions/scratch3_translate/index.js index f81f5890b94..3fe4e022a0c 100644 --- a/src/extensions/scratch3_translate/index.js +++ b/src/extensions/scratch3_translate/index.js @@ -11,14 +11,14 @@ const formatMessage = require('format-message'); * @type {string} */ // eslint-disable-next-line max-len -const menuIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAGAklEQVRYhe1YbUxTVxh+rh02o0KtkOEgKA4U4yeRWCdgxDoxCnH6h22iqSz76aasZlnijzkTBlvS4TJ/LGaJsmiyESe4hAVJvMJGxwQhLKECcRWkpWNZERs6Ctb2Lm97C/fe3n6Jyfzhk5y09z3nPPe57znnPe85DMdxeJ6x6LlW90LgM8BLchR1dXUZeXl5b3Ect+ppXsEwzHBfX98PVVVVY0GbmjW2AdgpaFYP4JxTZ+iLyCVdJFeuXNmdn59fn56enrFkyRIsWhSfk30+H1wuF+x2+1hPT4++oqLiJi/wEoA8AJslXSqdOsOlmARWV1dnlpeXd2ZnZ2fEK0xOqMViGWtoaNh++vRpa9CuZo1ZAJokQlc5dYYROR6RCq1WW56WlhZV3H0H8O9sZIHEQVzEKbTzQooBPBCYz4TlET4oFIosGtZoOHUN+Ph61GYgLuIU2tSscSmAYwAeCcx6NWs8o2aNxVKOkEUi9R55qv428Ng7b3viA/6eAs7dmrctVgD6bYBKGZ6LB4mrk7F/whcmokApfh8BWu6G2mc8ADsktuWmAbtzozGiLUJdu9QQVSC98JUkYNgBfPsboH4Z+GhPoK62FZiaAU7sCrTZmB5VHM3BPjVrrARwUVL1B4CD0vYxLVV68YFNQIICcLrn7SROtTjwEbGIE4iksFIpEVfs1BkeSdvGFUsObAz8Gm8CNTcC/49q42EIEbkLwKfhxCGWIRZC/zrQ/ifgcAWMK5YB+zc8nUBeZFuUORmfQIp/PsHGM/04YMta5oPT6cTs7Cw8Ho+oj9vtzmloaCgPZQtApVI96ejo6K2trR3lOM4nrRftJCzLfq3T6Y7LCfvuNtDL7wepfKgkTz6ZdeHdzePYlq30xz2lUintHhH0UbQ12my2+oKCguMcx7mE7aOHmWHgsxvzzzQP3ysMxMfzt2bxKmNHyZblSE5OjktYEImJidBoNFCr1frOzs5khmHe4Thubp8SCVQoFBwNUUJCwpyNwsfyZGBDOvB2fuCZQAH56KYJKJUpTy1OCOJYvXr1ocbGxjIAPwarRKvYZrNdn5iYEHV8LRW4cBj4oHheXBDT09PPRFwQxKXRaIQpmVjgkSNHfrFardcmJydjIqSMRehtOfzjmMTZmm/8hf5HAnF5vV7RVicSyHGcR6vVHh4YGPjKYrFMkTelq5JAH0B1MzMzUT+iu6cfdwfv+wv9jxchgZomaEFBwcmcnJxVY2NjXQqFQlQ/Pj6O/v7+s2az+U2Hw9Ec7X3tHXfm/v/c2hG3wLCruLm5+VBGRoY2mJGQJ0nc4ODgqZKSkjqKWSzL7olEPjJqx4PRv5CaqvE/OxyTflvWitj3xbBbnUql2kRxjYTRcA4MDHR1d3frguJiIW//NeC9/SVF2LplvcgWK8J6sKWl5UuVSrXO4/HYHj58+FNZWVkLx3HT8Rz0u3vN/t8Ho3aRaH3FgYULrKmpodT8jeBzvDcQ3T1m/5D6RXX0zNmn3TP+uq356xcmkE/NTwLoc+oMTXGpA3CnN7Bi99Hw5s8PL4mlulgFys5BXlwbn4I3qlnjsXgFBr22f+8OrFub7S/79u4Q1cWCEA8KxAmPhRfVrBFy51cK1nJnj+/rvwix0eqVswu5pJDzoPTMKhSZJzQolUoLZSLPCsRFnEI6OYE7I7xPdGYoKiq6YLVaByllWiiIg7iIM5rAYBouBB2yq5w6g+iATWGnqampZGhoqItiJSUP4YrcR9CQUh31JQ7iIk5hm7AXmPxdip5/dNIUCnduYBgm8fLly9tzc3NLwzlSqVTuW7NmzVphQkubwL179+xdXV3HKisrTVJxiJKwnuGHVM2XNjVrPCh3h8IT3+SLLKqrq+tKS0uvrly5UksJKvjsJSkpKd3r9TrkxCGSBxHwIoWXc7zAIOiIOOLUGULOsNHAMIzSZDJ9npmZeSIlJcWfTdPQm0ym8zqd7n257hGPnXxYyePv8py8mVb40ji1+UGZUmFh4Yetra1bzGbzteHh4SlKQNxu961wff7XS3Sau/w0c4VLQF7c8i8IAP4DcHKth/4Ur7MAAAAASUVORK5CYII='; +const menuIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAACXBIWXMAABYlAAAWJQFJUiTwAAABXFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAOvYwAAACOjo6EhIQOvYx4eHicnJwOvYytra0OvYykpKSfn5/BwcEOvYy0tLSvr6+pqakOvYy1tbXExMQOvYy+vr66urrCwsIOvYzLy8vFxcXAwMC9vb3GxsYOvYzKysrHx8cOvYy9vb20tLTLy8sOvYzR0dHPz88OvYzU1NTS0tIOvYza2trX19fV1dUOvYze3t7c3Nz////9/f36+vr4+Pj0+P/19fXx8fHp8v/u7u7s7Ozq6+7d6//n5+fl5eXS5f/i4uLf4eXg4ODb29vH3v/Z2dnV19y82P/R0dG10/+x0f/KzNSgx/+bxP+rv9uVwf+Rv/+1uMKPvv+huNmIt/h/tP+gpLFsqf9rqf9lpf+Wmqhho/9fov9coP9an/9Znv9Ynf9VnP9Smv9Rmf9Nl/+BhpdJkPMOvYx2fI5rcoZhZ31XXnVRayw6AAAAOXRSTlMAAgUHCgwOEBMbHSAgMTBBQENFTlBSU1ZgZHBwcnOBgI6QkpOgoK2usLS3vMDJydDX1+Dk5OXw8vIZ3wVeAAACCklEQVR42tXU7XPSMBzA8SAoDjYEFcUxrIN1PoHMbaJpC7UFbOfDUKdOUFHLfM6MmP//zoQuCWm90ze+8PsCcsnnfnc0APhvWlipKa0s0M06xljPKa6wbRtwLsPeLgCgNzGtBGSZLc4k3crQgyyjWQkrNj/vtfnKrgBaehNjXcKaGPjtrRhZY67MRmp5ASGtvT8ajdAX+rI/G8tgGYcpcIBEAw5zoasrEHpP0QfP+4gGHuQQlJhrpiUM+4o8D32GUEAmpZPwGTr4hJ5IyMprwkkIJwi9gwLy4rB3gNCkZzh9n3btfFhxMRGBvTeUTdD3F77Tmcvx144r8CFC6Dlsv35lw0j25eQRrJps4PuXd+nbPRfGcs/xL08fih6YcWhWj+CxdQfyHvFF9/CwG3sCydU77myS4z7mh0NChhKKTjYMutG/eOYqP/xByPQ38IILoelXEuKZ7pDplOzEYdUy3capBBBwTIZjMo7DxetrxdT8LU1JEJCff77OPTJrLwbT2lkFBmS8uxuQIArTTYxL85CQLvtAREDpqJQ/NDVDwDqelaPLZTsO7WUOcZhGl6kNK+qsjRSHeY2yzTJgZRpuJ8xiyui4jQyQ6Ri30uEyVbgUdpNJ89ZpOk+WbWHczAKlzA2HSn8JKJVamNIryl5y1e9AK3otWZ3SOlBKLK3fvl8Ef1XqROJf/Xv/Ao6e1+rnxxl1AAAAAElFTkSuQmCC'; /** * Icon svg to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} */ // eslint-disable-next-line max-len -const blockIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAN+UlEQVR4Ae1ce2xT1xn/Tkhq4hqHJKRLDAlQGI+GUfFc14HaLmxuGd0ab93GgK6Vmm01y9BUsaU0RfyRFTakaRHq3So6jVapWEUxa9dRuU8x6IAGCoO6wa1KXiSQOE9jkjivO/2u7yWOuff6XvvekFb5SUdx7ON7v/vz9zrnO+cwnudpAokjZYK75DBBYJKYIDBJTBCYJCYITBJfOgIZYzbGWA5jLJ8xNm/z5s334a/4P1omYyzNsPt9WdIYxhiUId/j8azPz89fY7VaF6ampjqi+4TD4Qvd3d0f7t+/fx/HcTVE1M7z/EBS99VDoCikTWzWMdTgYSLqIaIQGs/zwzKyOaqrq1+aOnVqUUZGBqWnp5PFYqG0tDQaHh6mvr4+GhwcpFAoJLSenp4P9+7dW8Zx3Fme5zsTFSxVa0eovtPpnL1ly5YfzJgxw2WxWBYketNEAO25dOmSp7Ky8iBjrFbmoW12u70oOzubMjMzR32QkpJCVqtVeG2322lgYIACgcDK0tLS1+6+++4yxpiH5/krCQkGDYzXiCi3qqrKXVNTE7x48SLf0dHB9/X18WMF3Av3xL0hA2SBTNFyE9E8v9/PX758WbNUuCa+4/F4ymKvp7XF1UDGWK7H43m0sLBwZ05Ozg2/7lgApoiGe3d2dk5ZsWLFcx6Px84Y2xelOcHW1taXiOiRcDgsaJ2gljab0GDKscD1Jk2ahHd3ejwePOtenufb9TySKoEw26qqKhfIy83NFdT/ZiP6oauqqoKMsf2iObeuXr26vKKiwpOVlTXFbrfb8/LyFubk5KyBu1H68aVnGh4e3uZ2u08yxo7pCixKqgrX4XQ6l8JkoOrjDZAJskFGyBolt0UMcGhgJ19yP2rm3dDQwJ85c+akXlNWI9B++PDh38PvjFdANsgIWVUfksheUVHxfZDY3d0t+zT9/f2CP3S73feJWYZFC4FqJmxDtJ06daphRnuiluhrDqJbLcZcD7JBRiJ6Dj5Qrg9jDHfLhlm3tbUdslgsj8i5IvhI+MpNmzaVLlq0yCN+9wMiCvA8H1KSQY1AK3yHFP6ThfcTouePEaVNItrzI6LbpiR/TcgmplOyQmLE4XQ6C3fv3v0y+iEQIbggjZELKiB2+vTpxXl5ecUIRD6fr/nQoUNuxtjbPM/3yN1DLREWPsNNjUBNC9HgMFEKI2q5asglo2VTeo7sioqKP6anpwtBZObMmZSfny9LHokRG5+jn8PhoFtuucVRXFzMQdmVZPiyTyakIblGBqE3/QKZIBLDQafTmavUT/NIRA3XwkSlB4jaFD3FCPqHiJ5+Xb3PNBvRnoeN85UYyiUCmDHg9XoVn8wQDTxRR9RxjQjxLl4DgfH64Fq4pgEY6OjoONTe3q6bRPTH9zBmFsfgsjBEA4vmE/kuE30eiPzfN0B0WYyJGelEWQpx6FJXhNC0FKIcG9Fk0TUVZEWuaQBad+zYUbF79+6FjY2NC+DfpBGKGkBeY2MjBYPBC2VlZU9g1sZUAoFf3zvyGia9/u8RbRrmiSofvrG/1IeEaEn0/E+NkmQEmLVhjPmIaAMisRYSo8nbunXrBq/X6+N5PqzU35QgAt8177bI655+ovPNN/Z50xeJyIyIlswwQ4oI8PAgAWSAFJCjZM56ySMzo/DP7iJKTSEaGibi/jP6M2jfwbNEQzzRpBSin68yS4oItJCYCHlkJoEYcWSKvu9KkOjwxyOf7T9F1DsQ0b6CTGOS6niQIxEJNSVBHhnpA+Xwm28RPfOvSAL9t+NEy2cShcJEr5+P+EcQ+PT9ZkowGiBF8olIsMPhcBFmrnt7e4Voi4Chhzwym0BoYWFexAcODBGVvUbU3RshbxIjWrdobLQvGhKJXq+3xO12z1q3bt2aN9544x2O45A4Neshj8wmENjmJHr8ZaJQ/0iizcRk+fFvmn13eYgk1TLGWjiOwxQWKY1148H0oRwiMohiUYky8Oz3zL5zfIA0qSV6DdM18NWPiF4+FXnNogh84h9EW9cQ3TV7pC+ceVTVTNPooa5OGLLMYkgmE0fcqp8STCPwYhvRn94jauqKBBHJbOED4Q8xAtn1FtH8rxA9WUSUNthJiQy5Zs2aRX6/35usvBqqfrJQrAujmu/3+/3z5s3TJQgCxsEzRP9riuSAUsBYXhCJysCWVyP+EHkgiA0Hr9D9Xw3S/QuJJlvShIlSca4vASr0A5MG0Piuri68vnr69OmyjRs3aip1GqaByPNePRuZCMDwTSIuPY1oy32jTfWFDUQvniB67RzRta4rtDwvSN8tJBrnVT9ZGEIgpupf+C/RgGh90CpMEKwtJFq/XH5aCiOVb0zvpH+fipD3Baj6yUKNQIEOqLcWU4IPx9ANGue6k+iBQvX5PPi6lHD7dc0bD+RJgCxDQ0O0bNmyXU6n8wRjrFsxsKhUshznzp2r0VrSbAny/OcB7eU7VMdQBfuiV/3U8sAQohIcqxZgRHH7NO2/MlIVEitr4xVRVT+bkoiqBCKkIyp1dia8eEkRiHokVtbGK+JV/VQJhM17vd5ahPRAIICZCkMfU8r3xipVSQQaqn7qURjRB0u/ENIRleBYb0aaEQ+Btk4qfXLnqF7bn/oF3bFgjun3jjsWRh7kcrn2VVdXb25pablaW1uLXOl6xWo84LD36A1SHDl6akwk05QHgkTkQwjpsQsstSa/V65cGeUGMIbFMMwIyJFVfdpHj2zopVut6YbcQwmaZ2Ngzl6v9+zatWv/sHjx4u9UVlYKAzMUoOMB5HV1dV09cODAQ/NFOJ1OpxEPAKJ6evtueB/vnTrtM+IWqtA1nYXAwvM81GgAi3CUFi5KQKBobm4WyDt48OCm8vLy93me/xQNSmjEAxw5NqJ91vTJQpNQ/dE4I5AikwxWjuPWZGVlFWM9shLgI+vr6zHDcoHjuAdF8gwN5dd6eulUFEkrlhUKTQI+Q4AxE4lMqOasWrXqafg9uRREquiDvKamppe2bdv2kz179pwwmjyS8X3Lly4SWjSqT38s/2WDkMhkggUBJHbsCuIQndH6+/ubjxw58ju32/0eXKCeCUo9iDbfadMyr2sfzFjyi4ffOkZrnatNoi8xAoX1JjabrRhDnehZZBDn9/v3uFyuV+ItTEwWdQ3NVN9w+fpVViwdMV0QeeTYaeF1W1un0HdWgcNoEQQkYsJd27dvfxa+7dKlS9TQ0NBcV1d36OTJk5sLCwtXuVwujuf5WjPJIxnzvWf18uuvY834TZk80Sjo1kBxdPLp4sWLizBnKr4NewnqLQkmg1gCy575s+LVkOo8UWKOHAlV5cSAgGmadnG/WWCsyZPL/ZSAvmaNTHRroLho2xFdlGaMXRSDxZiQGJvf3bHgdtl+n1y4OOo70WZuFHQRCPKwaHvXrl1/sVqtK7EsYs6cOdsee+yxd8vLy3+Lir/ZJCKvi879Zhbk0fanfinb91dP7hSCCEXlhDnTjJ0M0WzCEnlYZ5eZmbly7ty5woLs2bNnYzxchPfxuaihpiE2r7tnlbJWRUdmMikn1ERgNHl2u33UIkUM5fA/3h8LEpHXRWPFskWKfWNNNva7RkDLZkNF8iTgf7yPFaDoh9VPZpnzvVEaZ7VOVjVJ5H4/fOjbRoswGnG2SIG8pSgu1dXV8UNDQ6pFGHyOfugv7mFT3C5FRHNRVBrLbbN6AdkgI2RNZK+cLvIkyJCYonB9XVW/mwHIBhkhayJVuWxEWyWzVYJkzjabbcGOHTvKUbBT6Kqr6nczANkgo9o2BzVWbEhVMGWllbzrF01JIXwPU16IMwrdTK36JQuxbHEVMiZEoNPpFKaaE62axSPd7KpfMoAskAmyQUa12STFKOz1egODg4PN9fX1Dqxb0TJ1LwG/HuYEg8Hgu5i9Ueo3Hqt+kB3k+Xy+p8QVWqrmoZbGtGOrJ3YrNjc3O6StonhAOTKx4h21D0xvYTYa6+0wOlHb5UMjBat9WMiDtShdXV1TvkjL21TPjcEpQJiB5jhOWM28ZMkSV0FBQTG2gsoBJU/MQp8/f/5tt9v9gZ5F20Yeq4LJXlhNPEjaRjELLEWz1eaYNR57AlWwYTs88iJsj5cDFgxhWz2218fbhq90ToN4zgF+obk4ykRvk7b2azn+JGabf754b9m0S3ceqPCAuTiYAQc0KAGCR53tIgklHQKh6RyCZFr0+QhNTU1x81f0OX78uMe0c2Ni0I7jknDiTzAYxNEiN3SA6VgsFmGV57lz50oDgcA7fr9f2ErQ0dFxlTH2ERE1mVUnwVwlY+z9lpaWB0tKSv4aDocXwOUo+VOkW6FQqJjjOI94gpG+FfsJmFk2TvqB6iudgCGZBzJ5aCsaRif4ztGjR19M9NfWKadl3bp1d+J+uG9bW5uiNra2tkojjpm675OgcLkSiXqGYjBvcWw5z2wC+RGf6uA4bqPP52v67LPPZImMGvPqliuhNdKxqUdvb+8UrJFRW6VAN2Epm+gmmhlj/ySiDzwez4/nz59f2tnZ6ZCOhEJqhvQFlUa1nFUJCS8ylxYcud3umpKSkl2hUGilJFRqaipNnjz5+hEjyLOwoa+7u1tKrk2t2MnIKmygYYzhBI5XqqqqHpgzZ84au93+dRwqgRQGlUaxzqMLSR/AKJ4Gme12uxeuX7/+0YyMjJWxORxGND09PTWNjY3vuFyu/UTUaFYQ0SizRcwOpIU0Q2JVUf8Pa6C/AZGZYuqSL+VkYh6H/3OQS46F7xvLNnGSeZKYOMU3SUwQmCQmCEwSEwQmiQkCkwER/R+aET3lwEIlXgAAAABJRU5ErkJggg=='; +const blockIconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAACXBIWXMAABYlAAAWJQFJUiTwAAABTVBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMTExHR0dFRUVtbW1qamoAAACEhISWlpakpKSurq62tra9vb3Dw8PHx8fLy8vPz8/S0tLV1dXX19dGiedMl/9Nl/9PmP9Qmf9Rmf9Smv9WnP9XXnVYnf9Znv9an/9coP9hZ31ho/9jpP9mpf9op/9rcoZrqf9uqv9zrf92fI52r/96otl6sf9/tP+BhpeDtv+LkKCMvP+OrtmPvv+Rv/+WmqibxP+gpLGgx/+rrrqrzf+1uMK10/+41f+5ubm82P/AwsvH3v/KzNTS5f/V19zW19nZ2dnZ4u7b29vd6//e3t7f4eXg4ODi4uLl5eXn5+fp8v/q6urq6+7s7Ozu7u7x8fHz8/P09fb0+P/19fX4+Pj6+vr9/f3///9QAhvhAAAAJHRSTlMAAgUHCgwOERMVGBodHyEkJi8yND9BRk9caniFk6GuvMnX5fIj/n0CAAAEq0lEQVR42u2Y23ebRhDGkdElFhgTEiIkRxcgIFmV29pJXTW9xU0bu7bT+tZusSIhOZEU2Zj//7EL8naxF+agJo/+Hnw4PuLHzM7AN7vcve4Vr9yyKKuyKBaWPgsus1KpGwhLr6pFEJnJC6tyolaFfIYLJNSdi6nnX19OXNRQC8m8grKmI0D6mhLeLaOxfyPPNcvFJF6xbPbGV36irsY9fHcIHNL/jlGlmMCr4AcDoncXq6g/GIw9P9QEVR7E5ltGE4hF7i4XuIxY0spPdfL8ianGVCajmCQ+UGNTwZXhs9m8WDZvMh80YpLOr/X8VOqt5cktJXOek4fUHH8XKOgxAZ7MYkLUBS4UL2nVmyDcmqZJudvAVcTW94/1L0ZsrdEqF2hJ0XFp5oWZDvrIKGW5qGTkM/rV3jjzGSF53hR1J5rT1DGETwOKaOpH5SElCTjbsona5GJrxgDvdNkUyUnAo6bFqHnEpFzrXftU1/1Gcsq/dbsvbPvrbqi2tf6i2/2FSTmj6P3rCE9XeGgNZ7b1Fblox64hxxMi5UFF+c5qhQU5aNqvGGCUSHkw8KxlfxMEuGG1RiwwSqQ8uG227NZb399t2l22baJEj/Jg4FnTao/ObcsescAIsY4GqEF4cGP/iLuvbTV3fQDI8ZK6pkqEBwPx8uGOfu5DQKxslr7DMNA/si2cMABkBAMPWjZewfZJUMaJ6yCiP58kuCEMPP+2ZeE1tK3m96MxoUFuCAPPfmph1KvZ7HnTsp+9/juFG0LAt1tNjNs48bF+X3/2Qzo3TAaerONirO/O/FD/vE7rhokWcNJufXkwI6+9g1K7YaJJjc6jj17YDWEbdYEAGTdMY/QOAurLuGGKUQQhP6WQDAxLIPB9B+svAMiOczBwLwC+gYHRgZOGOQzeXBa4GQA3P0JAOhKLKvL+45klWX7CAE87oY5TAEO3dUlHu2YpH/cV2sHh4SB3UgGzGumSq57+GPNY4MdgAd/gP+/TAFf0i3l4H1D1Ic/FAQ8x6zRI+zANUEZXIc4xNCHDxQJfdjrbYWG20wClmns5HTpGhYyPDPAdjm3P94Oc36UAFh7pyKiVpXzil3xvTjqlrQhXOS+I4jIPWAPOlWgzCQi4IgM87kR0DAKpb68AEe5gzs+hOqQVISCvNNAA1RWeBdLvwks/1HbQigCQTlMenX0Y4CHtvz1yyQKh6YwCaVi0f7ZBIDs/ssD9/f3DyPV+PBCccFcXswCWR4kZxg0XMimhEfAosVcr/r9NJV386Z1RQFx82xuVgrw7GyNx4Y35LYmGEw1x7NSLix4d3Fa2ZKD+YM70Bn2kK0sLHm7cVU7SNGIovaom8eDxy5AGRwZOVnyOWN4E+xN4QFQyh3Rbq4pkJGZUbAyIg5bFfDbLc6zIcYNLuszFDZakJdWckET0p5pWEjNJxMd6j/gj0rKJxAcV0iPeeIBLU018OP+wij7Mg7zQVzgqcGIaAnuSjKAZToi8An4V9ojr0QpCP81JFcMZTi/dmsQBKqgN5E4ur31veuHUBQ5SXirXDKQ/KnCQlopqNWw7o15ZyXCw+GVRFAIPh5EFUZRLsricuz8cvle8/gVmm9beG/mviQAAAABJRU5ErkJggg=='; /** * The url of the translate server. diff --git a/src/extensions/scratch3_video_sensing/index.js b/src/extensions/scratch3_video_sensing/index.js index 5f8380fe424..3940043c06c 100644 --- a/src/extensions/scratch3_video_sensing/index.js +++ b/src/extensions/scratch3_video_sensing/index.js @@ -14,14 +14,14 @@ const VideoMotion = require('./library'); * @type {string} */ // eslint-disable-next-line max-len -const menuIconURI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIyMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5FeHRlbnNpb25zL1NvZnR3YXJlL1ZpZGVvLVNlbnNpbmctTWVudTwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxnIGlkPSJFeHRlbnNpb25zL1NvZnR3YXJlL1ZpZGVvLVNlbnNpbmctTWVudSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICAgICAgPGcgaWQ9InZpZGVvLW1vdGlvbiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDUuMDAwMDAwKSIgZmlsbC1ydWxlPSJub256ZXJvIj4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC1Db3B5IiBmaWxsPSIjMEVCRDhDIiBvcGFjaXR5PSIwLjI1IiBjeD0iMTYiIGN5PSI4IiByPSIyIj48L2NpcmNsZT4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC1Db3B5IiBmaWxsPSIjMEVCRDhDIiBvcGFjaXR5PSIwLjUiIGN4PSIxNiIgY3k9IjYiIHI9IjIiPjwvY2lyY2xlPgogICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLUNvcHkiIGZpbGw9IiMwRUJEOEMiIG9wYWNpdHk9IjAuNzUiIGN4PSIxNiIgY3k9IjQiIHI9IjIiPjwvY2lyY2xlPgogICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsIiBmaWxsPSIjMEVCRDhDIiBjeD0iMTYiIGN5PSIyIiByPSIyIj48L2NpcmNsZT4KICAgICAgICAgICAgPHBhdGggZD0iTTExLjMzNTk3MzksMi4yMDk3ODgyNSBMOC4yNSw0LjIwOTk1NjQ5IEw4LjI1LDMuMDUgQzguMjUsMi4wNDQ4ODIyNyA3LjQ2ODU5MDMxLDEuMjUgNi41LDEuMjUgTDIuMDUsMS4yNSBDMS4wMzgwNzExOSwxLjI1IDAuMjUsMi4wMzgwNzExOSAwLjI1LDMuMDUgTDAuMjUsNyBDMC4yNSw3Ljk2MzY5OTM3IDEuMDQyMjQ5MTksOC43NTU5NDg1NiAyLjA1LDguOCBMNi41LDguOCBDNy40NTA4MzAwOSw4LjggOC4yNSw3Ljk3MzI3MjUgOC4yNSw3IEw4LjI1LDUuODU4NDUyNDEgTDguNjI4NjIzOTQsNi4wODU2MjY3NyBMMTEuNDI2Nzc2Nyw3Ljc3MzIyMzMgQzExLjQzNjg5NDMsNy43ODMzNDA5MSAxMS40NzU3NjU1LDcuOCAxMS41LDcuOCBDMTEuNjMzNDkzMiw3LjggMTEuNzUsNy42OTEyNjAzNCAxMS43NSw3LjU1IEwxMS43NSwyLjQgQzExLjc1LDIuNDE4MzgyNjkgMTEuNzIxOTAyOSwyLjM1MjgyMjgyIDExLjY4NTYyNjgsMi4yNzg2MjM5NCBDMTEuNjEyOTUyOCwyLjE1NzUwMDY5IDExLjQ3MDc5NjgsMi4xMjkwNjk1IDExLjMzNTk3MzksMi4yMDk3ODgyNSBaIiBpZD0idmlkZW9fMzdfIiBzdHJva2Utb3BhY2l0eT0iMC4xNSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjAuNSIgZmlsbD0iIzRENEQ0RCI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'; +const menuIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDIwIDIwIj48dGl0bGU+RXh0ZW5zaW9ucy9Tb2Z0d2FyZS9WaWRlby1TZW5zaW5nLU1lbnU8L3RpdGxlPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0ibm9uemVybyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCA1KSI+PGNpcmNsZSBjeD0iMTYiIGN5PSI4IiByPSIyIiBmaWxsPSIjMGViZDhjIiBvcGFjaXR5PSIuMjUiLz48Y2lyY2xlIGN4PSIxNiIgY3k9IjYiIHI9IjIiIGZpbGw9IiMwZWJkOGMiIG9wYWNpdHk9Ii41Ii8+PGNpcmNsZSBjeD0iMTYiIGN5PSI0IiByPSIyIiBmaWxsPSIjMGViZDhjIiBvcGFjaXR5PSIuNzUiLz48Y2lyY2xlIGN4PSIxNiIgY3k9IjIiIHI9IjIiIGZpbGw9IiMwZWJkOGMiLz48cGF0aCBmaWxsPSIjNGQ0ZDRkIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIuMTUiIHN0cm9rZS13aWR0aD0iLjUiIGQ9Im0xMS4zMzYgMi4yMS0zLjA4NiAyVjMuMDVjMC0xLjAwNS0uNzgxLTEuOC0xLjc1LTEuOEgyLjA1Yy0xLjAxMiAwLTEuOC43ODgtMS44IDEuOFY3YzAgLjk2NC43OTIgMS43NTYgMS44IDEuOEg2LjVjLjk1IDAgMS43NS0uODI3IDEuNzUtMS44VjUuODU4bC4zNzkuMjI4IDIuNzk4IDEuNjg3Yy4wMS4wMS4wNDkuMDI3LjA3My4wMjdhLjI1LjI1IDAgMCAwIC4yNS0uMjVWMi40YzAgLjAxOC0uMDI4LS4wNDctLjA2NC0uMTIxLS4wNzMtLjEyMS0uMjE1LS4xNS0uMzUtLjA3WiIvPjwvZz48L3N2Zz4='; /** * Icon svg to be displayed at the left edge of each extension block, encoded as a data URI. * @type {string} */ // eslint-disable-next-line max-len -const blockIconURI = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNDBweCIgaGVpZ2h0PSI0MHB4IiB2aWV3Qm94PSIwIDAgNDAgNDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDUyLjIgKDY3MTQ1KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5FeHRlbnNpb25zL1NvZnR3YXJlL1ZpZGVvLVNlbnNpbmctQmxvY2s8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZyBpZD0iRXh0ZW5zaW9ucy9Tb2Z0d2FyZS9WaWRlby1TZW5zaW5nLUJsb2NrIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2Utb3BhY2l0eT0iMC4xNSI+CiAgICAgICAgPGcgaWQ9InZpZGVvLW1vdGlvbiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDEwLjAwMDAwMCkiIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlPSIjMDAwMDAwIj4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC1Db3B5IiBmaWxsPSIjRkZGRkZGIiBvcGFjaXR5PSIwLjI1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGN4PSIzMiIgY3k9IjE2IiByPSI0LjUiPjwvY2lyY2xlPgogICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLUNvcHkiIGZpbGw9IiNGRkZGRkYiIG9wYWNpdHk9IjAuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBjeD0iMzIiIGN5PSIxMiIgcj0iNC41Ij48L2NpcmNsZT4KICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC1Db3B5IiBmaWxsPSIjRkZGRkZGIiBvcGFjaXR5PSIwLjc1IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGN4PSIzMiIgY3k9IjgiIHI9IjQuNSI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwiIGZpbGw9IiNGRkZGRkYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgY3g9IjMyIiBjeT0iNCIgcj0iNC41Ij48L2NpcmNsZT4KICAgICAgICAgICAgPHBhdGggZD0iTTIyLjY3MTk0NzcsNC40MTk1NzY0OSBMMTYuNSw4LjQxOTkxMjk4IEwxNi41LDYuMSBDMTYuNSw0LjA4OTc2NDU0IDE0LjkzNzE4MDYsMi41IDEzLDIuNSBMNC4xLDIuNSBDMi4wNzYxNDIzNywyLjUgMC41LDQuMDc2MTQyMzcgMC41LDYuMSBMMC41LDE0IEMwLjUsMTUuOTI3Mzk4NyAyLjA4NDQ5ODM5LDE3LjUxMTg5NzEgNC4xLDE3LjYgTDEzLDE3LjYgQzE0LjkwMTY2MDIsMTcuNiAxNi41LDE1Ljk0NjU0NSAxNi41LDE0IEwxNi41LDExLjcxNjkwNDggTDIyLjc1NzI0NzksMTUuNDcxMjUzNSBMMjIuODUzNTUzNCwxNS41NDY0NDY2IEMyMi44NzM3ODg2LDE1LjU2NjY4MTggMjIuOTUxNTMxLDE1LjYgMjMsMTUuNiBDMjMuMjY2OTg2NSwxNS42IDIzLjUsMTUuMzgyNTIwNyAyMy41LDE1LjEgTDIzLjUsNC44IEMyMy41LDQuODM2NzY1MzggMjMuNDQzODA1OCw0LjcwNTY0NTYzIDIzLjM3MTI1MzUsNC41NTcyNDc4OCBDMjMuMjI1OTA1Niw0LjMxNTAwMTM5IDIyLjk0MTU5MzcsNC4yNTgxMzg5OSAyMi42NzE5NDc3LDQuNDE5NTc2NDkgWiIgaWQ9InZpZGVvXzM3XyIgZmlsbD0iIzRENEQ0RCI+PC9wYXRoPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+'; +const blockIconURI = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgdmlld0JveD0iMCAwIDQwIDQwIj48dGl0bGU+RXh0ZW5zaW9ucy9Tb2Z0d2FyZS9WaWRlby1TZW5zaW5nLUJsb2NrPC90aXRsZT48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9Ii4xNSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAxMCkiPjxjaXJjbGUgY3g9IjMyIiBjeT0iMTYiIHI9IjQuNSIgZmlsbD0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIuMjUiLz48Y2lyY2xlIGN4PSIzMiIgY3k9IjEyIiByPSI0LjUiIGZpbGw9IiNmZmYiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgb3BhY2l0eT0iLjUiLz48Y2lyY2xlIGN4PSIzMiIgY3k9IjgiIHI9IjQuNSIgZmlsbD0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIuNzUiLz48Y2lyY2xlIGN4PSIzMiIgY3k9IjQiIHI9IjQuNSIgZmlsbD0iI2ZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PHBhdGggZmlsbD0iIzRkNGQ0ZCIgZD0ibTIyLjY3MiA0LjQyLTYuMTcyIDRWNi4xYzAtMi4wMS0xLjU2My0zLjYtMy41LTMuNkg0LjFDMi4wNzYgMi41LjUgNC4wNzYuNSA2LjFWMTRjMCAxLjkyNyAxLjU4NCAzLjUxMiAzLjYgMy42SDEzYzEuOTAyIDAgMy41LTEuNjUzIDMuNS0zLjZ2LTIuMjgzbDYuMjU3IDMuNzU0LjA5Ny4wNzVjLjAyLjAyLjA5OC4wNTQuMTQ2LjA1NC4yNjcgMCAuNS0uMjE3LjUtLjVWNC44YzAgLjAzNy0uMDU2LS4wOTQtLjEyOS0uMjQzLS4xNDUtLjI0Mi0uNDMtLjI5OS0uNy0uMTM3WiIvPjwvZz48L3N2Zz4='; /** * Sensor attribute video sensor block should report. @@ -531,6 +531,10 @@ class Scratch3VideoSensingBlocks { * @returns {number} the motion amount or direction of the stage or sprite */ videoOn (args, util) { + if (this.runtime.privacyRestrictionsActive) { + return -1; + } + this.detect.analyzeFrame(); let state = this.detect; @@ -554,6 +558,10 @@ class Scratch3VideoSensingBlocks { * reference */ whenMotionGreaterThan (args, util) { + if (this.runtime.privacyRestrictionsActive) { + return false; + } + this.detect.analyzeFrame(); const state = this._analyzeLocalMotion(util.target); return state.motionAmount > Number(args.REFERENCE); diff --git a/src/extensions/scratch3_wedo2/index.js b/src/extensions/scratch3_wedo2/index.js index 64a6ee46171..9dc7b584963 100644 --- a/src/extensions/scratch3_wedo2/index.js +++ b/src/extensions/scratch3_wedo2/index.js @@ -14,7 +14,7 @@ const log = require('../../util/log'); * @type {string} */ // eslint-disable-next-line max-len -const iconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAACXBIWXMAABYlAAAWJQFJUiTwAAAF8klEQVR4Ae2cbWxTVRjH/7ctbVc2tyEMNpWBk0VIkLcEjSAQgglTE5HEaKqJi1E/mbCP/dJA0kQbvzgTQ0Ki2T7V6AeYGoEPLJmGKPiyzZDwEpYJCHSbQIcbdLvres1zOa13Xbvdu2eTDp9fst329Lnn5XfPPfece7tphmFAmDkuccdDBDIRgUxEIBMRyEQEMhGBTEQgExHIRAQyEYFMRCATEchEBDIRgUxEIBMRyEQEMhGBTEQgExHIxMPNIByNVQBoBUDb7kgo2KTS9wBoUmFNkVCwW6U3A1gP4JJKHwxHY/S+WcW2RkLBVhV7AMAOAIMAGlWstbyOSCh4QMU2Uoy1PBVL+a7IqZu1vOZIKNg20/azBarGvKxebw9HY22RULADwBFLTBcATQnZl4lVEimN4ssteXQrQfstebQpmW1q30xshyqvxRLbofYnYW9ZYgeV8C5LLOWlzbTxM3ouHI7GPgSwWx3Z0syBSBku6IYnlTbM+uQenJQaMnKHDaqAFnDrcCFbl3G1defEjas0a4N/Vz10OybyvapfrSX1sjpo+WIz0ME7QL3djgtHPTAcjb2mepw/b2ZaGh5NL5RnofR8R99dIC5fHusK5JsrCUpm7TSx21XvbcwTNwnbAsPR2GcA3qaG+H0LsHlDPZ7fca/ujZ+cRW9/Em5vCXzlNVhQUjFpf/3OTSRvXkKJz43Xt1bh1S1LUeq/5+njQ9/iVmLIfL1ieRU2b1iFtavztXNu6TrTi8PfnYI67WdPoOp5przV9Y8iuHdb9rOW9uumPI+vDIElddBckztPOqVn5X36Xj1WVQeynx1sOWbK83jc2PviM/dFXIYNax9H55leXLoyYHsfWwI14JCRRx7x5ckBU1oheYQ+1G9u39lVM0Hej7+cR7w/Yb7e9+5LqChfaLvixcK088BwNNZkAOV02ubK6+odwt3RcfOULSSPGEveG48bNj08If3kqXPmdtO6unkpDzYn0u/TLxrzcumJJ80Ut79sygzoFF6/siw75mUYupOEpmnY0/A0pw33FTsCa+hX5oJhZXgkZb5zub2O20CnL7EwkPeCPm+wI7CEBvi5wuOZ36tJW7X3uGXJXAgxk8P4eNpRPEvgskqfuR0Z/BNGejxvDM3/5gs0pboWv+motqybCc+tqUCzz43kaBJ/X+2eMjZ3ClNsjIzo5ioknXZ2b4AlkKYltLJoaY9jOJm/B0KJbtg4c4F/XOmH3+dF9dLKbBo1OD6QQGV56YQ55ODtO0jcHkZ1VSX8/n9nB9S7RkZ1rFy+NG8ZR9s70TeQQKDEh7vJUdt1Y9/OopXFB2/WcbMpyOexE9mlFS21aLlHMmKHfzBl0QT/hV2bzM9oLXv0xG8YGR0zpdLEn6RT2k+/XjDzoLX2G3u3TZBLUyral/Z5qCyAK1f/sl2/or+IWNel1Eji3MWrpjyCZHWqdNrSe6ieSHFERl4mP+q5GehgHGvvRGal5XI5uzU47f3A/R99YTgdF2wXrmkolr9ToZ5NvTjT4yOhoC2T057CJM/r9WDxoqmXa07R9THcuDVcMO8bt4ag6ynULKvkFjWBTLl0ugZKvNlyqLeSQKfYGgOpgXt2b5zVhlzrS+Dr451YvKg0b95txztxvS8xZ+VuXFuLJ5+oNgV+9c3PuHDxGs6cu+w4v//9RJo6x5bN9UgbBo4cPY1U6j+cSD8orFvzGFYuX4KxsRQGbth6FCICc9m5dY05HtN46AQRqPB5PWjY+ZT5RnMwkxGBFh5ZVmle9Z3MrGbjwfqccrC1vajrV7QCaVCfS6qrJj96nQlFK5CujPRT7MgYyEQEMhGBTGwJpAW4kJ9pBbo0zbx70X7y7AOv8HxP3LyB4YTpb2cZBt2iqL3QEwf9zDbX+waLca439QMeC7a+YBmOxugLiM/OTt2yaOoMoO+H6LOcNwf6xusrthsh/7mIh1yFmYhAJiKQiQhkIgKZiEAmIpCJCGQiApmIQCYikIkIZCICmYhAJiKQiQhkIgKZiEAmIpCJCGQiAjkA+AeOwQKMcWZqHgAAAABJRU5ErkJggg=='; +const iconURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAMAAAC5zwKfAAAACXBIWXMAABYlAAAWJQFJUiTwAAABQVBMVEX///98h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V8h6V9h6V8h6V8h6V8h6VwhKxyhat8h6V8h6VwhKxwhKx8h6U9ecw+e88/fdJAf9VBgNlDhN9EhuJGgM9GjOxHgM9Hju9Ij/JKk/lLlfxMl/9fkNVtmtlwhKx4hqd5o9x6h6Z8h6V9iKV9iKZ+iKZ+iaaAi6iBjKmCjamEjqqGkKyIkq6Jkq6MlrCOmLKQmbGUnbaVnraWn7WWn7aYobmZormao7qcpbudpbqevOWjq76lrcGqxOmttMevtsi1u8y2zey3vcu6v9C9w9K+w8/FytfLz9fO0t3O3fLS1dvS1uDX2d/a5vXe4ejf4eTm5+jm6O7v8PTz9/z39/n///+zX1z3AAAAInRSTlMAEDBAUFdgcICHkJygr7DAwc/Q3ODv8PD19vf7+/v8/f7+PDte4QAAAe9JREFUeNrt11tvEkEYxvGB1oqIjFVaDxWU0VqpJ2zVxx5kVayKumKp9ihai7vA+/0/gDOZNNbkzdJM9qJJ53cBhGf2n73YmxWe53med3plijIvxLiUWSHyspARWSknhMjJYsZsOSEmzJYp6GNmGxcjFAGMCWgiByAnpgFkxwBIIQ+3abvZY0nOTU6Vgac3Zha1mZvm89bic6BSAVAtVwFcktBkCUDJ/pQynxGsM9fhqCA456sItomeqNkHdWNe1doDordAuE9JugB7f1Ws67Wt7j6uG49U7YCI3mNV55KFbPCK7mn3b+uecU91iGgP6JNT8CwC0n6qubp1Rw2I6A2+kVvwMrZJ66j5uqUWSMMSOQavgYy2eng0uIfXrkGs8sGmczA4QcFPCcFNNWsfm7njB+OVhOCgpg5tHjM4fIeEIB08W7A69H+wF5uLe30i6veG5sZ6dtjAK/BBxr9gCGxQ3ETQpW6AZkzfgXBoj3x2CUKjHQChaWOHoPWIYgRxyAVXwFrCSF1ig2i0GGuwfzfAr029rPNBtCLGD3yIjBb4dTf6heX9VIPRFl5+TDUYfUEj3eCfBlIM2q8XKQbt6hBkuQe3WrzfLsFEPngE1lIOLuOra3AXXLAEuJsUjItlRqV6dWq0C/5NwvM8zzuV/gL7cbih1u2EKwAAAABJRU5ErkJggg=='; /** * A list of WeDo 2.0 BLE service UUIDs. diff --git a/src/io/mouse.js b/src/io/mouse.js index 169e6af0b67..bc46d907d84 100644 --- a/src/io/mouse.js +++ b/src/io/mouse.js @@ -101,16 +101,19 @@ class Mouse { if (!(data.x > 0 && data.x < data.canvasWidth && data.y > 0 && data.y < data.canvasHeight)) return; + // target will not exist if project is still loading const target = this._pickTarget(data.x, data.y); - const isNewMouseDown = !previousDownState && this._isDown; - const isNewMouseUp = previousDownState && !this._isDown; - - // Draggable targets start click hats on mouse up. - // Non-draggable targets start click hats on mouse down. - if (target.draggable && isNewMouseUp) { - this._activateClickHats(target); - } else if (!target.draggable && isNewMouseDown) { - this._activateClickHats(target); + if (target) { + const isNewMouseDown = !previousDownState && this._isDown; + const isNewMouseUp = previousDownState && !this._isDown; + + // Draggable targets start click hats on mouse up. + // Non-draggable targets start click hats on mouse down. + if (target.draggable && isNewMouseUp) { + this._activateClickHats(target); + } else if (!target.draggable && isNewMouseDown) { + this._activateClickHats(target); + } } } } diff --git a/src/io/video.js b/src/io/video.js index 35eeadf7cf4..65453e3be2b 100644 --- a/src/io/video.js +++ b/src/io/video.js @@ -157,6 +157,9 @@ class Video { if (renderer.markSkinAsPrivate) { renderer.markSkinAsPrivate(this._skinId); } + if (renderer.markDrawableAsNoninteractive) { + renderer.markDrawableAsNoninteractive(this._drawable); + } } // if we haven't already created and started a preview frame render loop, do so diff --git a/src/serialization/sb2.js b/src/serialization/sb2.js index 8f487a0ee6f..0c0db4636e0 100644 --- a/src/serialization/sb2.js +++ b/src/serialization/sb2.js @@ -414,7 +414,7 @@ const parseMonitorObject = (object, runtime, targets, extensions) => { } // Create a monitor record for the runtime's monitorState - runtime.requestAddMonitor(MonitorRecord({ + runtime.requestAddMonitor(new MonitorRecord({ id: block.id, targetId: block.targetId, spriteName: block.targetId ? object.target : null, diff --git a/src/serialization/sb3.js b/src/serialization/sb3.js index 69515ea10f4..63d3423362c 100644 --- a/src/serialization/sb3.js +++ b/src/serialization/sb3.js @@ -125,6 +125,16 @@ for (const opcode in VANILLA_CONSTANTS) { CONSTANT_OPCODE_BY_NAME[VANILLA_CONSTANTS[opcode].name] = opcode; } +const MIST_PATCHING_OPCODES = { + mistsutils_patchreporter: ['patching_jsreporter', 1], + mistsutils_patchreporter2: ['patching_jsreporter', 2], + mistsutils_patchreporter3: ['patching_jsreporter', 3], + mistsutils_patchboolean: ['patching_jsboolean', 1], + mistsutils_patchcommand: ['patching_jscommand', 1], + mistsutils_patchcommand2: ['patching_jscommand', 2], + mistsutils_patchcommand3: ['patching_jscommand', 3] +}; + const collapseConstants = function (blocks) { for (const id in blocks) { if (!hasOwnProperty.call(blocks, id)) continue; @@ -714,38 +724,6 @@ const serializeSound = function (sound) { return obj; }; -// Using some bugs, it can be possible to get values like undefined, null, or complex objects into -// variables or lists. This will cause make the project unusable after exporting without JSON editing -// as it will fail validation in scratch-parser. -// To avoid this, we'll convert those objects to strings before saving them. -const isVariableValueSafeForJSON = value => ( - typeof value === 'number' || - typeof value === 'string' || - typeof value === 'boolean' -); -const makeSafeForJSON = value => { - if (Array.isArray(value)) { - let copy = null; - for (let i = 0; i < value.length; i++) { - if (!isVariableValueSafeForJSON(value[i])) { - if (!copy) { - // Only copy the list when needed - copy = value.slice(); - } - copy[i] = `${copy[i]}`; - } - } - if (copy) { - return copy; - } - return value; - } - if (isVariableValueSafeForJSON(value)) { - return value; - } - return `${value}`; -}; - /** * Serialize the given variables object. * @param {object} variables The variables to be serialized. @@ -767,12 +745,12 @@ const serializeVariables = function (variables) { continue; } if (v.type === Variable.LIST_TYPE) { - obj.lists[varId] = [v.name, makeSafeForJSON(v.value)]; + obj.lists[varId] = [v.name, v.value]; continue; } // otherwise should be a scalar type - obj.variables[varId] = [v.name, makeSafeForJSON(v.value)]; + obj.variables[varId] = [v.name, v.value]; // only scalar vars have the potential to be cloud vars if (v.isCloud) obj.variables[varId].push(true); } @@ -958,10 +936,7 @@ const serializeMonitors = function (monitors, runtime, extensions) { serializedMonitor.isDiscrete = monitorData.isDiscrete; } return serializedMonitor; - }) - // By default the sequence is lazily evaluated, but we want it to be evaluated right - // now to update the used extension list. - .toArray(); + }); }; /** @@ -1333,6 +1308,16 @@ const deserializeBlocks = function (blocks) { deserializeInputDesc(block, null, false, blocks); continue; } + const patching = MIST_PATCHING_OPCODES[block.opcode]; + if (patching) { + block.opcode = patching[0]; + block.inputs = Object.fromEntries(Object.entries(block.inputs).map(([name, input]) => { + const newName = /^[ABC]$/.test(name) ? `ARG${name.charCodeAt(0) - 64}` : name; + if (input && !Array.isArray(input)) input.name = newName; + return [newName, input]; + })); + block.mutation = {tagName: 'mutation', children: [], itemcount: String(patching[1])}; + } block.id = blockId; // add id back to block since it wasn't serialized block.inputs = deserializeInputs(block.inputs, blockId, blocks); block.fields = deserializeFields(block.fields); @@ -1427,6 +1412,54 @@ const parseScratchAssets = function (object, runtime, zip) { return assets; }; +/** + * Fix various backwards-incompatible changes that Scratch made in the spork migration. + * @param {object} blocks Blocks, mutated in-place. + */ +const fixSporkCompatibility = function (blocks) { + for (const blockId in blocks) { + if (!Object.prototype.hasOwnProperty.call(blocks, blockId)) continue; + + const block = blocks[blockId]; + const opcode = block.opcode; + + switch (opcode) { + // Custom block definition prototype blocks used to be marked as shadow: true, but spork marks as shadow: false. + // Our scratch-blocks relies on it being shadow: true to prevent moving, so we'll force it to be that way. + case 'procedures_prototype': + block.shadow = true; + break; + + // For completeness with the above, set the argument reporter generators to be shadow: true as well. + case 'argument_reporter_string_number': + case 'argument_reporter_boolean': { + const parent = blocks[block.parent]; + if (parent && parent.opcode === 'procedures_prototype') { + block.shadow = true; + } + break; + } + + // control_stop used to define a mutation for whether it has a connection below, which is what old + // scratch-blocks relies on to determine if there is another conneciton below or not. Spork does not define + // this mutation and relies only on the STOP_OPTION field. We will generate the mutation if it's missing so + // that a "stop other scripts in sprite" block doesn't cause the workspace to fail to load. + case 'control_stop': { + if (!block.mutation) { + const stopOption = block.fields?.STOP_OPTION?.value; + const hasNext = stopOption === 'other scripts in sprite' || stopOption === 'other scripts in stage'; + block.mutation = { + tagName: 'mutation', + hasnext: hasNext ? 'true' : 'false', + children: [] + }; + } + break; + } + } + } +}; + /** * Parse a single "Scratch object" and create all its in-memory VM objects. * @param {!object} object From-JSON "Scratch object:" sprite, stage, watcher. @@ -1471,6 +1504,8 @@ const parseScratchObject = function (object, runtime, extensions, zip, assets) { extensions.extensionIDs.add(extensionID); } } + // Take a third pass to fix various things that spork broke. + fixSporkCompatibility(object.blocks); } // Costumes from JSON. const {costumePromises} = assets; @@ -1742,7 +1777,7 @@ const deserializeMonitor = function (monitorData, runtime, targets, extensions) } } - runtime.requestAddMonitor(MonitorRecord(monitorData)); + runtime.requestAddMonitor(new MonitorRecord(monitorData)); }; // Replace variable IDs throughout the project with diff --git a/src/serialization/validate-project.js b/src/serialization/validate-project.js index 0a0108e2eca..c0f0cfffd3f 100644 --- a/src/serialization/validate-project.js +++ b/src/serialization/validate-project.js @@ -232,12 +232,12 @@ const unzipProject = function (input, isSprite, callback, onProgress) { * @param {*} input Project data. * @param {boolean} isSprite Whether to treat the input as a sprite. * @param {Function} callback Called with (error, [project, zip]). - * @param {Function=} opt_onProgress Called with (stage, loaded, total) as the + * @param {Function=} optOnProgress Called with (stage, loaded, total) as the * project is unzipped, parsed and validated, for the loading screen. * @returns {void} */ -module.exports = function (input, isSprite, callback, opt_onProgress) { - const onProgress = opt_onProgress || function () {}; +module.exports = function (input, isSprite, callback, optOnProgress) { + const onProgress = optOnProgress || function () {}; const unpackProject = (looksLikeZip(input) && typeof TextDecoder !== 'undefined') ? unzipProject : unpack; // unpack (scratch-parser) ignores the extra argument; unzipProject uses it. diff --git a/src/util/tw-safe-stringify.js b/src/util/tw-safe-stringify.js new file mode 100644 index 00000000000..6491986ab7f --- /dev/null +++ b/src/util/tw-safe-stringify.js @@ -0,0 +1,30 @@ +const circularReplacer = () => { + const seen = new WeakSet(); + return (_, value) => { + if (typeof value === 'object' && value !== null) { + if (seen.has(value)) { + return Array.isArray(value) ? '[...]' : '{...}'; + } + seen.add(value); + } + return value; + }; +}; + +/** + * Safely stringify, properly handling circular relations and -0. + * @param {unknown} input Any value + * @returns {string} A stringified version of the input. + */ +const safeStringify = input => { + if (typeof input === 'object' && input !== null) { + return JSON.stringify(input, circularReplacer()); + } + // -0 stringifies as "0" by default. + if (Object.is(input, -0)) { + return '-0'; + } + return `${input}`; +}; + +module.exports = safeStringify; diff --git a/src/virtual-machine.js b/src/virtual-machine.js index 2adeb9c7fc4..67085395745 100644 --- a/src/virtual-machine.js +++ b/src/virtual-machine.js @@ -29,6 +29,14 @@ const {exportCostume} = require('./serialization/tw-costume-import-export'); const Base64Util = require('./util/base64-util'); const RESERVED_NAMES = ['_mouse_', '_stage_', '_edge_', '_myself_', '_random_']; +const COMPILER_TYPES = Object.freeze({ + ANY: 'any', + NUMBER: 'number', + NUMBER_OR_NAN: 'numberOrNaN', + STRING: 'string', + BOOLEAN: 'boolean', + COMMAND: 'command' +}); if (typeof document === 'undefined') { global.document = { @@ -154,7 +162,7 @@ class VirtualMachine extends EventEmitter { this.emitTargetsUpdate(emitProjectChanged); }); this.runtime.on(Runtime.MONITORS_UPDATE, monitorList => { - this.emit(Runtime.MONITORS_UPDATE, monitorList); + this.emit(Runtime.MONITORS_UPDATE, monitorList.toImmutable()); }); this.runtime.on(Runtime.BLOCK_DRAG_UPDATE, areBlocksOverGui => { this.emit(Runtime.BLOCK_DRAG_UPDATE, areBlocksOverGui); @@ -266,16 +274,61 @@ class VirtualMachine extends EventEmitter { Sprite, RenderedTarget, JSZip, + Variable, - i_will_not_ask_for_help_when_these_break: () => { + compiler: Object.freeze({ + types: COMPILER_TYPES, + register: (extensionId, blocks) => { + if (typeof extensionId !== 'string' || !extensionId || !blocks || typeof blocks !== 'object') { + throw new TypeError('compiler.register expects an extension ID and block descriptor object'); + } + for (const opcode of Object.keys(blocks)) { + const descriptor = blocks[opcode]; + if (!descriptor || typeof descriptor.compile !== 'function' || + !Object.values(COMPILER_TYPES).includes(descriptor.type)) { + throw new TypeError(`Invalid compiler descriptor for ${extensionId}_${opcode}`); + } + this.runtime.compilerExtensions.set(`${extensionId}_${opcode}`, Object.freeze({ + type: descriptor.type, + compile: descriptor.compile + })); + } + this.runtime.resetAllCaches(); + } + }), + + these_broke_before_and_will_break_again: () => { console.warn('You are using unsupported APIs. WHEN your code breaks, do not expect help.'); - return ({ + return { JSGenerator: require('./compiler/jsgen.js'), IRGenerator: require('./compiler/irgen.js').IRGenerator, ScriptTreeGenerator: require('./compiler/irgen.js').ScriptTreeGenerator, + IntermediateStackBlock: require('./compiler/intermediate.js').IntermediateStackBlock, + IntermediateInput: require('./compiler/intermediate.js').IntermediateInput, + IntermediateStack: require('./compiler/intermediate.js').IntermediateStack, + IntermediateScript: require('./compiler/intermediate.js').IntermediateScript, + IntermediateRepresentation: require('./compiler/intermediate.js').IntermediateRepresentation, + StackOpcode: require('./compiler/enums.js').StackOpcode, + InputOpcode: require('./compiler/enums.js').InputOpcode, + InputType: require('./compiler/enums.js').InputType, Thread: require('./engine/thread.js'), execute: require('./engine/execute.js') - }); + }; + }, + + i_will_not_ask_for_help_when_these_break: () => { + this.emit('LEGACY_EXTENSION_API', 'i_will_not_ask_for_help_when_these_break'); + + const oldCompilerCompatibility = require('./compiler/old-compiler-compatibility.js'); + oldCompilerCompatibility.enabled = true; + + return { + IRGenerator: oldCompilerCompatibility.IRGeneratorStub, + ScriptTreeGenerator: oldCompilerCompatibility.ScriptTreeGeneratorStub, + JSGenerator: oldCompilerCompatibility.JSGeneratorStub, + Thread: require('./engine/thread.js'), + execute: require('./engine/execute.js') + }; } }; } @@ -593,6 +646,22 @@ class VirtualMachine extends EventEmitter { file.date = date; } + // Tell JSZip to only compress file formats where there will be a significant gain. + const COMPRESSABLE_FORMATS = [ + '.json', + '.svg', + '.wav', + '.ttf', + '.otf' + ]; + for (const file of Object.values(zip.files)) { + if (COMPRESSABLE_FORMATS.some(ext => file.name.endsWith(ext))) { + file.options.compression = 'DEFLATE'; + } else { + file.options.compression = 'STORE'; + } + } + return zip; } @@ -604,9 +673,9 @@ class VirtualMachine extends EventEmitter { */ saveProjectSb3 (type, options) { return this._saveProjectZip(options).generateAsync({ + // Don't configure compression here. _saveProjectZip() will set it for each file. type: type || 'blob', - mimeType: 'application/x.scratch.sb3', - compression: 'DEFLATE' + mimeType: 'application/x.scratch.sb3' }); } @@ -822,7 +891,10 @@ class VirtualMachine extends EventEmitter { this.extensionManager.loadExtensionIdSync(extensionID); } else { // Custom extension - const url = extensionURLs.get(extensionID) || defaultExtensionURLs.get(extensionID); + let url = extensionURLs.get(extensionID); + if (!url && Object.prototype.hasOwnProperty.call(defaultExtensionURLs, extensionID)) { + url = defaultExtensionURLs[extensionID]; + } if (!url) { throw new Error(`Unknown extension: ${extensionID}`); } diff --git a/test/fixtures/execute/tw-NaN.sb3 b/test/fixtures/execute/tw-NaN.sb3 index 17ddc26bdb1..411b0c6670d 100644 Binary files a/test/fixtures/execute/tw-NaN.sb3 and b/test/fixtures/execute/tw-NaN.sb3 differ diff --git a/test/fixtures/execute/tw-analyze-yields-due-to-direct-recursion.sb3 b/test/fixtures/execute/tw-analyze-yields-due-to-direct-recursion.sb3 new file mode 100644 index 00000000000..136864b417e Binary files /dev/null and b/test/fixtures/execute/tw-analyze-yields-due-to-direct-recursion.sb3 differ diff --git a/test/fixtures/execute/tw-automatic-variable-creation-literal-null-id.sb3 b/test/fixtures/execute/tw-automatic-variable-creation-literal-null-id.sb3 new file mode 100644 index 00000000000..57a7c005e21 Binary files /dev/null and b/test/fixtures/execute/tw-automatic-variable-creation-literal-null-id.sb3 differ diff --git a/test/fixtures/execute/tw-block-with-null-for-variable-id.sb3 b/test/fixtures/execute/tw-block-with-null-for-variable-id.sb3 new file mode 100644 index 00000000000..68b151ee32d Binary files /dev/null and b/test/fixtures/execute/tw-block-with-null-for-variable-id.sb3 differ diff --git a/test/fixtures/execute/tw-compatibility-layer-type-barrier.sb3 b/test/fixtures/execute/tw-compatibility-layer-type-barrier.sb3 new file mode 100644 index 00000000000..635f80d5d92 Binary files /dev/null and b/test/fixtures/execute/tw-compatibility-layer-type-barrier.sb3 differ diff --git a/test/fixtures/execute/tw-exit-state-accounts-for-yields-in-procedures.sb3 b/test/fixtures/execute/tw-exit-state-accounts-for-yields-in-procedures.sb3 new file mode 100644 index 00000000000..6d194449637 Binary files /dev/null and b/test/fixtures/execute/tw-exit-state-accounts-for-yields-in-procedures.sb3 differ diff --git a/test/fixtures/execute/tw-gh-249-quicksort.sb3 b/test/fixtures/execute/tw-gh-249-quicksort.sb3 new file mode 100644 index 00000000000..ff393d2a91f Binary files /dev/null and b/test/fixtures/execute/tw-gh-249-quicksort.sb3 differ diff --git a/test/fixtures/execute/tw-loop-condition-optimization-gh-276.sb3 b/test/fixtures/execute/tw-loop-condition-optimization-gh-276.sb3 new file mode 100644 index 00000000000..48099303ce1 Binary files /dev/null and b/test/fixtures/execute/tw-loop-condition-optimization-gh-276.sb3 differ diff --git a/test/fixtures/execute/tw-non-warp-loop-condition-analysis.sb3 b/test/fixtures/execute/tw-non-warp-loop-condition-analysis.sb3 new file mode 100644 index 00000000000..59c1cfcf66c Binary files /dev/null and b/test/fixtures/execute/tw-non-warp-loop-condition-analysis.sb3 differ diff --git a/test/fixtures/execute/tw-repeat-analysis-doesnt-reanalyze.sb3 b/test/fixtures/execute/tw-repeat-analysis-doesnt-reanalyze.sb3 new file mode 100644 index 00000000000..12d51fb79bc Binary files /dev/null and b/test/fixtures/execute/tw-repeat-analysis-doesnt-reanalyze.sb3 differ diff --git a/test/fixtures/execute/tw-repeat-procedure-reporter-infinite-analyzer-loop.sb3 b/test/fixtures/execute/tw-repeat-procedure-reporter-infinite-analyzer-loop.sb3 new file mode 100644 index 00000000000..1d91e7bc4db Binary files /dev/null and b/test/fixtures/execute/tw-repeat-procedure-reporter-infinite-analyzer-loop.sb3 differ diff --git a/test/fixtures/execute/tw-repeat-until-false-item-from-list.sb3 b/test/fixtures/execute/tw-repeat-until-false-item-from-list.sb3 new file mode 100644 index 00000000000..9430bc8a2e7 Binary files /dev/null and b/test/fixtures/execute/tw-repeat-until-false-item-from-list.sb3 differ diff --git a/test/fixtures/execute/tw-rotate-by-decimal-without-leading-zero.sb3 b/test/fixtures/execute/tw-rotate-by-decimal-without-leading-zero.sb3 new file mode 100644 index 00000000000..4b8c5e14529 Binary files /dev/null and b/test/fixtures/execute/tw-rotate-by-decimal-without-leading-zero.sb3 differ diff --git a/test/fixtures/execute/tw-sensing-of-non-existent-costume-name.sb3 b/test/fixtures/execute/tw-sensing-of-non-existent-costume-name.sb3 new file mode 100644 index 00000000000..604a2ff277d Binary files /dev/null and b/test/fixtures/execute/tw-sensing-of-non-existent-costume-name.sb3 differ diff --git a/test/fixtures/execute/tw-simple-string-operations.sb3 b/test/fixtures/execute/tw-simple-string-operations.sb3 new file mode 100644 index 00000000000..0687b08ace3 Binary files /dev/null and b/test/fixtures/execute/tw-simple-string-operations.sb3 differ diff --git a/test/fixtures/execute/tw-sound-menu-avoids-number-literal-if-name-conflict.sb3 b/test/fixtures/execute/tw-sound-menu-avoids-number-literal-if-name-conflict.sb3 new file mode 100644 index 00000000000..ce978f1954e Binary files /dev/null and b/test/fixtures/execute/tw-sound-menu-avoids-number-literal-if-name-conflict.sb3 differ diff --git a/test/fixtures/execute/tw-state-analysis-understands-stop-this-script.sb3 b/test/fixtures/execute/tw-state-analysis-understands-stop-this-script.sb3 new file mode 100644 index 00000000000..735f45d77ca Binary files /dev/null and b/test/fixtures/execute/tw-state-analysis-understands-stop-this-script.sb3 differ diff --git a/test/fixtures/execute/tw-true-equals-1.sb3 b/test/fixtures/execute/tw-true-equals-1.sb3 new file mode 100644 index 00000000000..e76954b9ad0 Binary files /dev/null and b/test/fixtures/execute/tw-true-equals-1.sb3 differ diff --git a/test/fixtures/execute/tw-wait-until-condition-gh-277.sb3 b/test/fixtures/execute/tw-wait-until-condition-gh-277.sb3 new file mode 100644 index 00000000000..a170d42f737 Binary files /dev/null and b/test/fixtures/execute/tw-wait-until-condition-gh-277.sb3 differ diff --git a/test/fixtures/execute/tw-warp-loop-condition-analysis.sb3 b/test/fixtures/execute/tw-warp-loop-condition-analysis.sb3 new file mode 100644 index 00000000000..126857522d8 Binary files /dev/null and b/test/fixtures/execute/tw-warp-loop-condition-analysis.sb3 differ diff --git a/test/fixtures/tw-mixed-file-formats.sb3 b/test/fixtures/tw-mixed-file-formats.sb3 new file mode 100644 index 00000000000..f06c40d680b Binary files /dev/null and b/test/fixtures/tw-mixed-file-formats.sb3 differ diff --git a/test/fixtures/tw-slow-custom-reporter-stack-click.sb3 b/test/fixtures/tw-slow-custom-reporter-stack-click.sb3 new file mode 100644 index 00000000000..ef59b599a35 Binary files /dev/null and b/test/fixtures/tw-slow-custom-reporter-stack-click.sb3 differ diff --git a/test/fixtures/tw-spork-custom-block-definition.sb3 b/test/fixtures/tw-spork-custom-block-definition.sb3 new file mode 100644 index 00000000000..f9d5f9f733d Binary files /dev/null and b/test/fixtures/tw-spork-custom-block-definition.sb3 differ diff --git a/test/fixtures/tw-spork-stop-other-scripts.sb3 b/test/fixtures/tw-spork-stop-other-scripts.sb3 new file mode 100644 index 00000000000..994e66ac49e Binary files /dev/null and b/test/fixtures/tw-spork-stop-other-scripts.sb3 differ diff --git a/test/fixtures/tw-type-assertions.sb3 b/test/fixtures/tw-type-assertions.sb3 new file mode 100644 index 00000000000..1c91c399a19 Binary files /dev/null and b/test/fixtures/tw-type-assertions.sb3 differ diff --git a/test/integration/execute.js b/test/integration/execute.js index 2c758ecce39..88d9e7d475b 100644 --- a/test/integration/execute.js +++ b/test/integration/execute.js @@ -45,6 +45,9 @@ const whenThreadsComplete = (t, vm, uri, timeLimit = 5000) => const timeoutId = setTimeout(() => { t.fail(`Timeout waiting for threads to complete: ${uri}`); reject(new Error('time limit reached')); + + // Attempt to stop the lingering VM from interfering with other tests. + vm.quit(); }, timeLimit); // Clear the interval to allow the process to exit diff --git a/test/integration/tw_automatic_variable_creation.js b/test/integration/tw_automatic_variable_creation.js new file mode 100644 index 00000000000..e77d575ad53 --- /dev/null +++ b/test/integration/tw_automatic_variable_creation.js @@ -0,0 +1,43 @@ +const fs = require('fs'); +const path = require('path'); +const {test} = require('tap'); +const VM = require('../../src/virtual-machine'); + +for (const compilerEnabled of [false, true]) { + const prefix = compilerEnabled ? 'compiler' : 'interpreter'; + test(`${prefix} - quirks when block field has literal null for variable ID`, t => { + const vm = new VM(); + vm.setCompilerOptions({ + enabled: compilerEnabled + }); + t.equal(vm.runtime.compilerOptions.enabled, compilerEnabled, 'compiler options sanity check'); + + // The execute tests ensure that this fixture compiles and runs fine and the snapshot test ensures + // it compiles correctly. This additional test will ensure that the internal variable objects are + // being created with the expected properties. + const fixturePath = path.join( + __dirname, + '../fixtures/execute/tw-automatic-variable-creation-literal-null-id.sb3' + ); + + vm.loadProject(fs.readFileSync(fixturePath)).then(() => { + vm.greenFlag(); + vm.runtime._step(); + + // Variable does not exist, should get made as local variable in sprite + const variables = vm.runtime.targets[1].variables; + t.equal(Object.keys(variables).length, 1, 'created 1 new variable'); + + // Scratch quirk - the entry in .variables should have key "null" + const newVariableKey = Object.keys(variables)[0]; + t.equal(newVariableKey, 'null', 'key is "null"'); + + // Scratch quirk - the actual variable.id should be the random string + const newVariable = Object.values(variables)[0]; + t.notEqual(newVariable.id, 'null', 'variable.id is not "null"'); + t.type(newVariable.id, 'string', 'variable.id is a string'); + + t.end(); + }); + }); +} diff --git a/test/integration/tw_compression_per_file_type.js b/test/integration/tw_compression_per_file_type.js new file mode 100644 index 00000000000..35f02a68cdb --- /dev/null +++ b/test/integration/tw_compression_per_file_type.js @@ -0,0 +1,31 @@ +const {test} = require('tap'); +const fs = require('fs'); +const path = require('path'); +const VM = require('../../src/virtual-machine'); +const makeTestStorage = require('../fixtures/make-test-storage'); +const JSZip = require('@turbowarp/jszip'); + +test('saveProjectSb3() per-file compression', t => { + const vm = new VM(); + vm.attachStorage(makeTestStorage()); + const fixture = fs.readFileSync(path.join(__dirname, '../fixtures/tw-mixed-file-formats.sb3')); + vm.loadProject(fixture) + .then(() => vm.saveProjectSb3('arraybuffer')) + .then(buffer => JSZip.loadAsync(buffer)) + .then(zip => { + const isCompressed = pathInZip => { + // note: uses JSZip private APIs, not very stable, but it should be okay... + const file = zip.files[pathInZip]; + return file._data.compression.magic === '\x08\x00'; + }; + + t.ok(isCompressed('project.json')); + t.ok(isCompressed('5cb46ddd903fc2c9976ff881df9273c9.wav')); + t.ok(isCompressed('cd21514d0531fdffb22204e0ec5ed84a.svg')); + + t.notOk(isCompressed('0b2e50ca4107ce57416e2ceb840a6347.jpg')); + t.notOk(isCompressed('5c8826d846c06dddeb77590e8792fb7d.png')); + + t.end(); + }); +}); diff --git a/test/integration/tw_operator_type_matrix.js b/test/integration/tw_operator_type_matrix.js new file mode 100644 index 00000000000..035102fe037 --- /dev/null +++ b/test/integration/tw_operator_type_matrix.js @@ -0,0 +1,202 @@ +const {test} = require('tap'); +const VM = require('../../src/virtual-machine'); +const {BlockType, ArgumentType} = require('../../src/extension-support/tw-extension-api-common'); +const {IRGenerator} = require('../../src/compiler/irgen'); +const {IROptimizer} = require('../../src/compiler/iroptimizer'); +const {IntermediateInput, stringifyType} = require('../../src/compiler/intermediate'); +const nanolog = require('@turbowarp/nanolog'); + +const VALUES = [ + NaN, + + -Infinity, + -1e+308, + -1, + -0.5, + -1e-324, + -0, + 0, + 1e-324, + 0.5, + 1, + 1e+308, + Infinity +]; + +const createBinaryOperator = opcode => ({ + opcode, + inputNames: ['NUM1', 'NUM2'], + fields: {} +}); + +const createMathopOperator = name => ({ + opcode: 'operator_mathop', + inputNames: ['NUM'], + fields: { + OPERATOR: [ + name, + null + ] + } +}); + +const OPERATORS = [ + createBinaryOperator('operator_add'), + createBinaryOperator('operator_subtract'), + createBinaryOperator('operator_divide'), + createBinaryOperator('operator_multiply'), + createBinaryOperator('operator_mod'), + + createMathopOperator('abs'), + createMathopOperator('floor'), + createMathopOperator('ceiling'), + createMathopOperator('sqrt'), + createMathopOperator('sin'), + createMathopOperator('cos'), + createMathopOperator('tan'), + createMathopOperator('asin'), + createMathopOperator('acos'), + createMathopOperator('atan'), + createMathopOperator('ln'), + createMathopOperator('log'), + createMathopOperator('e ^'), + createMathopOperator('10 ^') +]; + +const str = number => (Object.is(number, -0) ? '-0' : number.toString()); + +test('operator type matrix', async t => { + + const vm = new VM(); + nanolog.disable(); + + let reportedValue; + + class TestExtension { + getInfo () { + return { + id: 'test', + name: 'Test', + blocks: [ + { + opcode: 'report', + blockType: BlockType.COMMAND, + text: 'report [INPUT]', + isEdgeActivated: false, + arguments: { + INPUT: { + type: ArgumentType.NUMBER, + defaultValue: 0 + } + } + } + ] + }; + } + report (args) { + reportedValue = args.INPUT; + } + } + + vm.extensionManager.addBuiltinExtension('test', TestExtension); + vm.setCompilerOptions({enabled: true}); + + vm.on('COMPILE_ERROR', () => { + t.fail('Compile error'); + }); + + const testOperator = async (operator, inputs) => { + + const inputsSB3 = {}; + for (let i = 0; i < inputs.length; i++) { + inputsSB3[operator.inputNames[i]] = [ + 1, + [ + 4, + `${Object.is(inputs[i], -0) ? '-0' : inputs[i]}` + ] + ]; + } + + await vm.loadProject({ + targets: [ + { + isStage: true, + name: 'Stage', + variables: {}, + lists: {}, + costumes: [ + { + name: 'dummy', + dataFormat: 'svg', + assetId: 'cd21514d0531fdffb22204e0ec5ed84a', + md5ext: 'cd21514d0531fdffb22204e0ec5ed84a.svg' + } + ], + sounds: [], + + blocks: { + report: { + opcode: 'test_report', + inputs: { + INPUT: [ + 3, + 'operator' + ] + } + }, + operator: { + opcode: operator.opcode, + inputs: inputsSB3, + fields: operator.fields + } + } + } + ], + meta: { + semver: '3.0.0', + vm: '0.2.0', + agent: '' + } + }); + + const thread = vm.runtime._pushThread('report', vm.runtime.targets[0]); + + const irGenerator = new IRGenerator(thread); + const ir = irGenerator.generate(); + const irOptimizer = new IROptimizer(ir); + irOptimizer.optimize(); + + + while (vm.runtime.threads.length !== 0) { + vm.runtime._step(); + } + + // The ir input representing our operator + const irOperator = ir.entry.stack.blocks[0].inputs.inputs.INPUT; + + const expectedType = IntermediateInput.getNumberInputType(reportedValue); + + t.ok( + irOperator.isSometimesType(expectedType), + `${operator.opcode}${JSON.stringify(operator.fields)}[${inputs.map(str)}] ` + + `outputted value ${str(reportedValue)} is of the expected type ${stringifyType(irOperator.type)}.` + ); + }; + + for (const operator of OPERATORS) { + if (operator.inputNames.length === 2) { + for (const left of VALUES) { + for (const right of VALUES) { + await testOperator(operator, [left, right]); + } + } + } else { + for (const value of VALUES) { + await testOperator(operator, [value]); + } + } + } + + t.end(); +}); diff --git a/test/integration/tw_privacy.js b/test/integration/tw_privacy.js index fda382f7114..0f2b1d760b7 100644 --- a/test/integration/tw_privacy.js +++ b/test/integration/tw_privacy.js @@ -114,3 +114,17 @@ test('custom extensions', async t => { t.equal(vm.renderer.privateSkinAccess, false); t.end(); }); + +test('hasExternalCommunicationMethod', t => { + const vm = new VM(); + t.equal(vm.runtime.privacyRestrictionsActive, false); + vm.runtime.setExternalCommunicationMethod('cloudVariables', true); + t.equal(vm.runtime.privacyRestrictionsActive, true); + vm.runtime.setExternalCommunicationMethod('customExtensions', true); + t.equal(vm.runtime.privacyRestrictionsActive, true); + vm.runtime.setExternalCommunicationMethod('cloudVariables', false); + t.equal(vm.runtime.privacyRestrictionsActive, true); + vm.runtime.setExternalCommunicationMethod('customExtensions', false); + t.equal(vm.runtime.privacyRestrictionsActive, false); + t.end(); +}); diff --git a/test/integration/tw_serialize_extension_only_used_by_monitor.js b/test/integration/tw_serialize_extension_only_used_by_monitor.js index a10cf18b1ca..05d55420423 100644 --- a/test/integration/tw_serialize_extension_only_used_by_monitor.js +++ b/test/integration/tw_serialize_extension_only_used_by_monitor.js @@ -4,12 +4,12 @@ const MonitorRecord = require('../../src/engine/monitor-record'); test('Correctly serializes native extension only used by monitors', t => { const vm = new VM(); - vm.runtime.requestAddMonitor(MonitorRecord({ + vm.runtime.requestAddMonitor(new MonitorRecord({ id: 'fakeblock1', opcode: 'pen_fakeblock', visiblle: true })); - vm.runtime.requestAddMonitor(MonitorRecord({ + vm.runtime.requestAddMonitor(new MonitorRecord({ id: 'fakeblock2', opcode: 'translate_fakeblock', visiblle: false @@ -22,12 +22,12 @@ test('Correctly serializes native extension only used by monitors', t => { test('Correctly serializes custom extension only used by monitors', t => { const vm = new VM(); - vm.runtime.requestAddMonitor(MonitorRecord({ + vm.runtime.requestAddMonitor(new MonitorRecord({ id: 'fakeblock1', opcode: 'fetch_fakeblock', visible: true })); - vm.runtime.requestAddMonitor(MonitorRecord({ + vm.runtime.requestAddMonitor(new MonitorRecord({ // should not be serialized at all id: 'fakeblock2', opcode: 'bitwise_fakeblock', diff --git a/test/integration/tw_serialize_hidden_monitors.js b/test/integration/tw_serialize_hidden_monitors.js index 66e41155db8..ea110549823 100644 --- a/test/integration/tw_serialize_hidden_monitors.js +++ b/test/integration/tw_serialize_hidden_monitors.js @@ -5,12 +5,12 @@ const MonitorRecord = require('../../src/engine/monitor-record'); test('does not serialize hidden monitors from extensions', t => { const rt = new Runtime(); - rt.requestAddMonitor(MonitorRecord({ + rt.requestAddMonitor(new MonitorRecord({ id: 'timer', opcode: 'sensing_timer', visible: true })); - rt.requestAddMonitor(MonitorRecord({ + rt.requestAddMonitor(new MonitorRecord({ id: 'other_monitor', opcode: 'tw_someOpcodeThatIsntPartOfACoreExtension', visible: true diff --git a/test/integration/tw_slow_custom_reporter_stack_click.js b/test/integration/tw_slow_custom_reporter_stack_click.js new file mode 100644 index 00000000000..847ca04112c --- /dev/null +++ b/test/integration/tw_slow_custom_reporter_stack_click.js @@ -0,0 +1,66 @@ +const {test} = require('tap'); +const fs = require('fs'); +const path = require('path'); +const VirtualMachine = require('../../src/virtual-machine'); + +const fixtureData = fs.readFileSync(path.join(__dirname, '../fixtures/tw-slow-custom-reporter-stack-click.sb3')); + +// After starting this block, first step will yield, second step will report value +const procedureCallBlockId = 'e'; + +test('when thread target is editing target', t => { + const vm = new VirtualMachine(); + vm.loadProject(fixtureData).then(() => { + const visualReports = []; + vm.on('VISUAL_REPORT', visualReport => { + visualReports.push(visualReport); + }); + + vm.setEditingTarget(vm.runtime.getSpriteTargetByName('Sprite1').id); + vm.runtime.toggleScript(procedureCallBlockId, { + stackClick: true + }); + + t.same(visualReports, []); + + vm.runtime._step(); + t.same(visualReports, []); + + vm.runtime._step(); + t.same(visualReports, [ + { + id: 'e', + value: 'return value' + } + ]); + + t.end(); + }); +}); + +test('when thread target is not editing target', t => { + const vm = new VirtualMachine(); + vm.loadProject(fixtureData).then(() => { + const visualReports = []; + vm.on('VISUAL_REPORT', visualReport => { + visualReports.push(visualReport); + }); + + vm.setEditingTarget(vm.runtime.getSpriteTargetByName('Sprite1').id); + vm.runtime.toggleScript(procedureCallBlockId, { + stackClick: true + }); + + t.same(visualReports, []); + + vm.runtime._step(); + t.same(visualReports, []); + + vm.setEditingTarget(vm.runtime.getSpriteTargetByName('Sprite2').id); + + vm.runtime._step(); + t.same(visualReports, []); + + t.end(); + }); +}); diff --git a/test/integration/tw_spork_compat.js b/test/integration/tw_spork_compat.js new file mode 100644 index 00000000000..c4bb82a312e --- /dev/null +++ b/test/integration/tw_spork_compat.js @@ -0,0 +1,67 @@ +const {test} = require('tap'); +const fs = require('fs'); +const path = require('path'); +const VM = require('../../src/virtual-machine'); + +test('spork compat: procedure prototype and argument reporters load as shadows', t => { + const vm = new VM(); + const fixture = fs.readFileSync(path.join(__dirname, '../fixtures/tw-spork-custom-block-definition.sb3')); + vm.loadProject(fixture).then(() => { + let prototypeCount = 0; + let argumentReporterCount = 0; + + for (const target of vm.runtime.targets) { + for (const block of Object.values(target.blocks._blocks)) { + if (block.opcode === 'procedures_prototype') { + prototypeCount++; + t.equal(block.shadow, true); + } else if (block.opcode.startsWith('argument_reporter_')) { + argumentReporterCount++; + t.equal(block.shadow, true); + } + } + } + + t.equal(prototypeCount, 1); + t.equal(argumentReporterCount, 2); + + t.end(); + }); +}); + +test('spork compat: control_stop blocks get a mutation derived from STOP_OPTION', t => { + const vm = new VM(); + const fixture = fs.readFileSync(path.join(__dirname, '../fixtures/tw-spork-stop-other-scripts.sb3')); + vm.loadProject(fixture).then(() => { + let otherScriptsInSprite = 0; + let all = 0; + let thisScript = 0; + + for (const target of vm.runtime.targets) { + for (const block of Object.values(target.blocks._blocks)) { + if (block.opcode !== 'control_stop') { + continue; + } + const stopOption = block.fields.STOP_OPTION.value; + if (stopOption === 'other scripts in sprite') { + otherScriptsInSprite++; + t.same(block.mutation, {tagName: 'mutation', hasnext: 'true', children: []}); + } else if (stopOption === 'all') { + all++; + t.same(block.mutation, {tagName: 'mutation', hasnext: 'false', children: []}); + } else if (stopOption === 'this script') { + thisScript++; + t.same(block.mutation, {tagName: 'mutation', hasnext: 'false', children: []}); + } else { + t.fail(`unexpected STOP_OPTION value: ${stopOption}`); + } + } + } + + t.equal(otherScriptsInSprite, 2); + t.equal(all, 1); + t.equal(thisScript, 1); + + t.end(); + }); +}); diff --git a/test/integration/tw_type_assertions.js b/test/integration/tw_type_assertions.js new file mode 100644 index 00000000000..745ffac7014 --- /dev/null +++ b/test/integration/tw_type_assertions.js @@ -0,0 +1,189 @@ +const fs = require('fs'); +const path = require('path'); +const {test} = require('tap'); +const VM = require('../../src/virtual-machine'); +const BlockType = require('../../src/extension-support/block-type'); +const ArgumentType = require('../../src/extension-support/argument-type'); +const {IRGenerator} = require('../../src/compiler/irgen'); +const {IROptimizer} = require('../../src/compiler/iroptimizer'); +const {StackOpcode, InputType, InputOpcode} = require('../../src/compiler/enums'); +const {IntermediateStack} = require('../../src/compiler/intermediate'); + +const fixture = fs.readFileSync(path.join(__dirname, '..', 'fixtures', 'tw-type-assertions.sb3')); + +test('type assertions', async t => { + const vm = new VM(); + vm.setCompilerOptions({enabled: true, warpTimer: false}); + + class TestExtension { + getInfo () { + return { + id: 'typeassert', + name: 'Type Assertions', + blocks: [ + { + opcode: 'assert', + blockType: BlockType.COMMAND, + text: 'assert [VALUE] is [ADVERB] [NOUN]', + arguments: { + VALUE: { + type: ArgumentType.STRING + }, + ADVERB: { + type: ArgumentType.STRING, + menu: 'ADVERB_MENU' + }, + NOUN: { + type: ArgumentType.STRING, + menu: 'NOUN_MENU' + } + } + }, + { + opcode: 'region', + blockType: BlockType.CONDITIONAL, + text: 'region [NAME]', + arguments: { + NAME: { + type: ArgumentType.STRING + } + } + } + ], + menus: { + ADVERB_MENU: { + acceptReporters: false, + items: ['never', 'always', 'sometimes', 'exactly'] + }, + NOUN_MENU: { + acceptReporters: false, + items: ['zero', 'infinity', 'NaN', 'a number', 'a string', 'number interpretable', 'anything'] + } + } + }; + } + assert () { } + region () { + return true; + } + } + + vm.extensionManager.addBuiltinExtension('typeassert', TestExtension); + + vm.on('COMPILE_ERROR', () => { + t.fail('Compile error'); + }); + + await vm.loadProject(fixture); + + const thread = vm.runtime.startHats('event_whenflagclicked')[0]; + + const enumerateAssertions = function* (blocks, region) { + for (const block of blocks) { + if (block.opcode === StackOpcode.COMPATIBILITY_LAYER) { + switch (block.inputs.opcode) { + case 'typeassert_assert': + yield {block, region}; + break; + case 'typeassert_region': { + const newRegionNameInput = block.inputs.inputs.NAME; + if (newRegionNameInput.opcode !== InputOpcode.CONSTANT) { + throw new Error('Region block inputs must be a constant.'); + } + yield* enumerateAssertions( + block.inputs.substacks['1'].blocks, + (region ? `${region}, ` : '') + newRegionNameInput.inputs.value + ); + break; + } + } + } else { + for (const inputName in block.inputs) { + const input = block.inputs[inputName]; + if (input instanceof IntermediateStack) { + yield* enumerateAssertions(input.blocks, region); + } + } + } + } + }; + + const irGenerator = new IRGenerator(thread); + const ir = irGenerator.generate(); + + const runTests = function (proccode, ignoreYields) { + + const assertions = [...enumerateAssertions(ir.getProcedure(proccode).stack.blocks)]; + + for (const {block} of assertions) { + block.ignoreState = true; + } + + const irOptimizer = new IROptimizer(ir); + irOptimizer.ignoreYields = ignoreYields; + irOptimizer.optimize(); + + for (const {block, region} of assertions) { + const valueInput = block.inputs.inputs.VALUE; + const adverb = block.inputs.fields.ADVERB; + const noun = block.inputs.fields.NOUN; + + let nounType; + + switch (noun) { + case 'zero': + nounType = InputType.NUMBER_ZERO; + break; + case 'infinity': + nounType = InputType.NUMBER_POS_INF; + break; + case 'NaN': + nounType = InputType.NUMBER_NAN; + break; + case 'a number': + nounType = InputType.NUMBER; + break; + case 'a string': + nounType = InputType.STRING; + break; + case 'number interpretable': + nounType = InputType.NUMBER_INTERPRETABLE; + break; + case 'anything': + nounType = InputType.ANY; + break; + default: throw new Error(`$Invalid noun menu option ${noun}`); + } + + let message; + + if (valueInput.opcode === InputOpcode.VAR_GET) { + message = `(${region}) assert variable '${valueInput.inputs.variable.name}' ` + + `(type ${valueInput.type}) is ${adverb} ${noun}`; + } else { + message = `(${region}) assert ${valueInput.opcode} (type ${valueInput.type}) is ${adverb} ${noun}`; + } + + switch (adverb) { + case 'never': + t.ok(!valueInput.isSometimesType(nounType), message); + break; + case 'always': + t.ok(valueInput.isAlwaysType(nounType), message); + break; + case 'sometimes': + t.ok(valueInput.isSometimesType(nounType), message); + break; + case 'exactly': + t.equal(valueInput.type, nounType, message); + break; + default: throw new Error(`$Invalid adverb menu option ${adverb}`); + } + } + }; + + runTests('run tests with yields', false); + runTests('run tests without yields', true); + + t.end(); +}); diff --git a/test/snapshot/__snapshots__/mw-get-from-list.sb3.tw-snapshot b/test/snapshot/__snapshots__/mw-get-from-list.sb3.tw-snapshot index 8cba2c167e9..60393bf45cd 100644 --- a/test/snapshot/__snapshots__/mw-get-from-list.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/mw-get-from-list.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: d758181c076886d498d4e14ea70e79759694c2f18910f309a1bb82861025f740 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["T}0U^Nr!iDn]OXVLQ!DT"]; const b1 = stage.variables["xiK*4nt~,{Bb#*%f|{9p"]; const b2 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; @@ -13,30 +10,27 @@ return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 3", target); b0.value = []; b0.value.push("thing"); +b0._monitorUpToDate = false; b1.value = 1; -b2.value = (b0.value[0] ?? ""); -if ((("" + b2.value).toLowerCase() === "thing")) { +b2.value = (b0.value[b1.value - 1] ?? ""); +if ((("" + b2.value).toLowerCase() === "thing".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } -b2.value = (b0.value[((toNotNaN(+b1.value) + 1) | 0) - 1] ?? ""); -if (compareEqual(b2.value, "")) { +b2.value = (b0.value[(b1.value + 1) - 1] ?? ""); +if ((("" + b2.value).toLowerCase() === "".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } -b1.value = 2; -b2.value = (b0.value[((toNotNaN(+b1.value) - 1) | 0) - 1] ?? ""); -if ((("" + b2.value).toLowerCase() === "thing")) { +thread.procedures["Zdo funny"](); +b2.value = (b0.value[(b1.value - 1) - 1] ?? ""); +if ((("" + b2.value).toLowerCase() === "thing".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } runtime.ext_scratch3_looks._say("end", target); -b0._monitorUpToDate = false; retire(); return; }; }) // Sprite1 Zdo funny -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["xiK*4nt~,{Bb#*%f|{9p"]; return function funXYZ_do_funny () { b0.value = 2; diff --git a/test/snapshot/__snapshots__/order-library-reverse.sb3.tw-snapshot b/test/snapshot/__snapshots__/order-library-reverse.sb3.tw-snapshot index 89e824ed1d0..dc849cf46e2 100644 --- a/test/snapshot/__snapshots__/order-library-reverse.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/order-library-reverse.sb3.tw-snapshot @@ -2,17 +2,13 @@ // Input SHA-256: b677669506b60e3ba350be8ae545db93d7bcbb5f368ba21d86b0d4e966e7e09c // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["p]KODv+)+:l=%NT~j3/d-order"]; const b1 = stage.variables["p]KODv+)+:l=%NT~j3/d-wait"]; return function* genXYZ () { b0.value = 0; thread.timer = timer(); -var a0 = max(0, 1000 * toNotNaN(+b1.value)); +var a0 = Math.max(0, 1000 * toNotNaN(+b1.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -29,16 +25,12 @@ retire(); return; }; }) // Sprite3 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["p]KODv+)+:l=%NT~j3/d-wait"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); thread.timer = timer(); -var a0 = max(0, 1000 * toNotNaN(+b0.value)); +var a0 = Math.max(0, 1000 * toNotNaN(+b0.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -46,7 +38,7 @@ yield; } thread.timer = null; thread.timer = timer(); -var a1 = max(0, 1000 * toNotNaN(+b0.value)); +var a1 = Math.max(0, 1000 * toNotNaN(+b0.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a1) { @@ -54,7 +46,7 @@ yield; } thread.timer = null; thread.timer = timer(); -var a2 = max(0, 1000 * toNotNaN(+b0.value)); +var a2 = Math.max(0, 1000 * toNotNaN(+b0.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a2) { @@ -66,17 +58,13 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["p]KODv+)+:l=%NT~j3/d-order"]; const b1 = stage.variables["p]KODv+)+:l=%NT~j3/d-wait"]; return function* genXYZ () { b0.value = 0; thread.timer = timer(); -var a0 = max(0, 1000 * toNotNaN(+b1.value)); +var a0 = Math.max(0, 1000 * toNotNaN(+b1.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { diff --git a/test/snapshot/__snapshots__/order-library.sb3.tw-snapshot b/test/snapshot/__snapshots__/order-library.sb3.tw-snapshot index 137a3bd6c29..c2b537cdcd5 100644 --- a/test/snapshot/__snapshots__/order-library.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/order-library.sb3.tw-snapshot @@ -2,16 +2,12 @@ // Input SHA-256: 7f0df1e9c4a6b87f8bbea53b22d5a1201ebe774e535661cef5da3bd75af45c11 // Sprite3 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["):/PVGTvoVRvq(ikGwRE-wait"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); thread.timer = timer(); -var a0 = max(0, 1000 * toNotNaN(+b0.value)); +var a0 = Math.max(0, 1000 * toNotNaN(+b0.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -19,7 +15,7 @@ yield; } thread.timer = null; thread.timer = timer(); -var a1 = max(0, 1000 * toNotNaN(+b0.value)); +var a1 = Math.max(0, 1000 * toNotNaN(+b0.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a1) { @@ -27,7 +23,7 @@ yield; } thread.timer = null; thread.timer = timer(); -var a2 = max(0, 1000 * toNotNaN(+b0.value)); +var a2 = Math.max(0, 1000 * toNotNaN(+b0.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a2) { @@ -39,17 +35,13 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["):/PVGTvoVRvq(ikGwRE-order"]; const b1 = stage.variables["):/PVGTvoVRvq(ikGwRE-wait"]; return function* genXYZ () { b0.value = 0; thread.timer = timer(); -var a0 = max(0, 1000 * toNotNaN(+b1.value)); +var a0 = Math.max(0, 1000 * toNotNaN(+b1.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -66,17 +58,13 @@ retire(); return; }; }) // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["):/PVGTvoVRvq(ikGwRE-order"]; const b1 = stage.variables["):/PVGTvoVRvq(ikGwRE-wait"]; return function* genXYZ () { b0.value = 0; thread.timer = timer(); -var a0 = max(0, 1000 * toNotNaN(+b1.value)); +var a0 = Math.max(0, 1000 * toNotNaN(+b1.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { diff --git a/test/snapshot/__snapshots__/tw-NaN.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-NaN.sb3.tw-snapshot index 6ea74252546..92d8d79e74f 100644 --- a/test/snapshot/__snapshots__/tw-NaN.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-NaN.sb3.tw-snapshot @@ -1,33 +1,72 @@ // TW Snapshot -// Input SHA-256: 2c124b6184d3cbeb3d692ba7a04266d8bf141c650a9cc43b28faf59ac394ee16 +// Input SHA-256: 7916f21ea252ad0887060c6eb7ade266b41077b30ed849ad33947e01e6f73514 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = runtime.getOpcodeFunction("operator_multiply"); return function* genXYZ () { -runtime.ext_scratch3_looks._say("plan 20", target); +runtime.ext_scratch3_looks._say("plan 21", target); +if (!(("" + (0 / 0)).toLowerCase() === "0".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + (0 * Infinity)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (compareEqual((yield* executeInCompatibilityLayer({"NUM1":0,"NUM2":Infinity,"NUM3":1,"mutation":{"tagName":"mutation","children":[],"itemcount":"3"},}, b0, false, false, "E", null)), 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + ((Math.acos(1.01) * 180) / Math.PI)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN(((Math.acos(1.01) * 180) / Math.PI)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + ((Math.asin(1.01) * 180) / Math.PI)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN(((Math.asin(1.01) * 180) / Math.PI)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + (0 / 0)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN((0 / 0)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + Math.sqrt(-1)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN(Math.sqrt(-1)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + mod(0, 0)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN(mod(0, 0)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + Math.log(-1)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN(Math.log(-1)) * 1) === 0)) { +runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + (Math.log(-1) / Math.LN10)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN((Math.log(-1) / Math.LN10)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN((Math.round(Math.sin((Math.PI * (1 / 0)) / 180) * 1e10) / 1e10)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN((Math.round(Math.cos((Math.PI * (1 / 0)) / 180) * 1e10) / 1e10)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN(tan((1 / 0))) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); -if (compareEqual((toNotNaN(runtime.ext_scratch3_operators._random(-Infinity, Infinity)) * 1), 0)) { +} +if (((toNotNaN(runtime.ext_scratch3_operators._random((-1 / 0), (1 / 0))) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/tw-add-can-return-nan.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-add-can-return-nan.sb3.tw-snapshot index 722afbd7f78..7ce7b186e9b 100644 --- a/test/snapshot/__snapshots__/tw-add-can-return-nan.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-add-can-return-nan.sb3.tw-snapshot @@ -2,13 +2,12 @@ // Input SHA-256: b435d9356099286cb062435cc2eb968544bcbcd9213e2b6da902eb3bb689f425 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); +if (!((Infinity + -Infinity) <= 0)) { runtime.ext_scratch3_looks._say("pass", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/tw-all-at-once.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-all-at-once.sb3.tw-snapshot index 9a70c6ec8e8..beca8936c7b 100644 --- a/test/snapshot/__snapshots__/tw-all-at-once.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-all-at-once.sb3.tw-snapshot @@ -2,13 +2,12 @@ // Input SHA-256: 428175715a6d8670b809c69bdda12e5043eff9921ccdd908507636a625938702 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); +if (true) { runtime.ext_scratch3_looks._say("pass", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/tw-analyze-yields-due-to-direct-recursion.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-analyze-yields-due-to-direct-recursion.sb3.tw-snapshot new file mode 100644 index 00000000000..32435b0af57 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-analyze-yields-due-to-direct-recursion.sb3.tw-snapshot @@ -0,0 +1,38 @@ +// TW Snapshot +// Input SHA-256: 848a4efc16b174b53f0a4b581e6b6d1091ae9eaa916e040c963e360ce3883509 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = stage.variables["FpLI$ida6)qR,q~y`1|*"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +b0.value = (1 + 2); +yield* thread.procedures["Znon-warp recursion %s"](2); +if ((("" + listGet(b1.value, b0.value)).toLowerCase() === "the only thing".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Znon-warp recursion %s +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +return function* genXYZ_non_warp_recursion_ (p0) { +if (compareGreaterThan(p0, 0)) { +yield; +yield* thread.procedures["Znon-warp recursion %s"]((toNotNaN(+p0) - 1)); +} +return ""; +}; }) + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +for (var a0 = 1; a0 > 0; a0--) { +yield; +} +b0.value = "random"; +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/tw-automatic-variable-creation-literal-null-id.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-automatic-variable-creation-literal-null-id.sb3.tw-snapshot new file mode 100644 index 00000000000..d3a2c80cab3 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-automatic-variable-creation-literal-null-id.sb3.tw-snapshot @@ -0,0 +1,12 @@ +// TW Snapshot +// Input SHA-256: 4764ae15e39b22b1a071c9ac79f8758f24ef41855802db8674e200fd26139ed0 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = target.variables["null"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 0", target); +b0.value = 5; +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/tw-block-with-null-for-variable-id.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-block-with-null-for-variable-id.sb3.tw-snapshot new file mode 100644 index 00000000000..153276f7b89 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-block-with-null-for-variable-id.sb3.tw-snapshot @@ -0,0 +1,36 @@ +// TW Snapshot +// Input SHA-256: 99bb22ac4fb2542ce3c21fa7d2025f03d15392a33850585a4d12f4ec558663ac + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = stage.variables[")|GMR5fz;%F_H,c0wGVM"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 2", target); +b0.value = 1; +b1.value = 2; +yield* waitThreads(startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "check 1" })); +yield* waitThreads(startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "check 2" })); +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +if ((toNotNaN(+b0.value) === 1)) { +runtime.ext_scratch3_looks._say("pass variable 1", target); +} +retire(); return; +}; }) + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables[")|GMR5fz;%F_H,c0wGVM"]; +return function* genXYZ () { +if ((toNotNaN(+b0.value) === 2)) { +runtime.ext_scratch3_looks._say("pass variable 2", target); +} +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/tw-boolean-arguments-are-not-cast.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-boolean-arguments-are-not-cast.sb3.tw-snapshot index 434ef1391cf..b7aca7680ef 100644 --- a/test/snapshot/__snapshots__/tw-boolean-arguments-are-not-cast.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-boolean-arguments-are-not-cast.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 9ecff9e3c4b1dcdf3e23d0e49c0a2da3de446b6d626a2b5ee39d761be20344ca // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); thread.procedures["ZBlock A %s"]("Hai!!!"); @@ -14,12 +11,9 @@ retire(); return; }; }) // Sprite1 ZBlock A %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_Block_A_ (p0) { -if ((("" + p0).toLowerCase() === "hai!!!")) { +if ((("" + p0).toLowerCase() === "Hai!!!".toLowerCase())) { runtime.ext_scratch3_looks._say("pass did not cast", target); } else { runtime.ext_scratch3_looks._say("fail was casted", target); diff --git a/test/snapshot/__snapshots__/tw-broadcast-id-and-name-desync.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-broadcast-id-and-name-desync.sb3.tw-snapshot index 4768f90d2c8..42f3cd396bf 100644 --- a/test/snapshot/__snapshots__/tw-broadcast-id-and-name-desync.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-broadcast-id-and-name-desync.sb3.tw-snapshot @@ -2,20 +2,14 @@ // Input SHA-256: f2d984762d77ff375ba3e39b5d57190b71a131f0d8620d2becb2735b7da116c3 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("pass", target); retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); yield* waitThreads(startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "message1" })); diff --git a/test/snapshot/__snapshots__/tw-change-size-does-not-use-rounded-size.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-change-size-does-not-use-rounded-size.sb3.tw-snapshot index 29b19553a9a..4d1afe46852 100644 --- a/test/snapshot/__snapshots__/tw-change-size-does-not-use-rounded-size.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-change-size-does-not-use-rounded-size.sb3.tw-snapshot @@ -2,19 +2,15 @@ // Input SHA-256: d1f532866d8de3d81185db7ecb94ecaa4e7549feb4e26ee4f849cd0aaf1bb154 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const round=Math.round; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); target.setSize(96); b0.value = 0; -while (!(100 === round(target.size))) { +while (!(100 === Math.round(target.size))) { b0.value = (toNotNaN(+b0.value) + 1); -target.setSize(target.size + ((100 - round(target.size)) / 10)); +target.setSize(target.size + ((100 - Math.round(target.size)) / 10)); yield; } if ((toNotNaN(+b0.value) === 20)) { diff --git a/test/snapshot/__snapshots__/tw-color-input-returns-hex.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-color-input-returns-hex.sb3.tw-snapshot index da9451ac250..56b3817737b 100644 --- a/test/snapshot/__snapshots__/tw-color-input-returns-hex.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-color-input-returns-hex.sb3.tw-snapshot @@ -2,15 +2,14 @@ // Input SHA-256: 28a59bb79ba328f31ac0b79f49143a2513080e30a7383fda80579d08021c3c82 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); b0.value = "#22388a"; +if ((b0.value.toLowerCase() === "#22388a".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/tw-comparison-matrix-inline.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-comparison-matrix-inline.sb3.tw-snapshot index 865dc2c0fc4..077f68f4d5d 100644 --- a/test/snapshot/__snapshots__/tw-comparison-matrix-inline.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-comparison-matrix-inline.sb3.tw-snapshot @@ -2,12 +2,1773 @@ // Input SHA-256: a419afcd49227908f6e7639bf006dca32430d3b406fbd9cd72aa14957d95ab67 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 0", target); +if (!(("" + (0 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 1: 0 should be < 0", target); +} +if (!(("" + (0 === 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 2: 0 should be = 0", target); +} +if (!(("" + (0 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 3: 0 should be > 0", target); +} +if (!(("" + (0 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 4: 0 should be < 0.0", target); +} +if (!(("" + (0 === 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 5: 0 should be = 0.0", target); +} +if (!(("" + (0 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 6: 0 should be > 0.0", target); +} +if (!(("" + (0 < 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 7: 0 should be < 1.23", target); +} +if (!(("" + (0 === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 8: 0 should be = 1.23", target); +} +if (!(("" + (0 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 9: 0 should be > 1.23", target); +} +if (!(("" + (0 < 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 10: 0 should be < .23", target); +} +if (!(("" + (0 === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 11: 0 should be = .23", target); +} +if (!(("" + (0 > 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 12: 0 should be > .23", target); +} +if (!(("" + (0 < 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 13: 0 should be < 0.123", target); +} +if (!(("" + (0 === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 14: 0 should be = 0.123", target); +} +if (!(("" + (0 > 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 15: 0 should be > 0.123", target); +} +if (!(("" + (0 < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 16: 0 should be < -0", target); +} +if (!(("" + (0 === -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 17: 0 should be = -0", target); +} +if (!(("" + (0 > -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 18: 0 should be > -0", target); +} +if (!(("" + (0 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 19: 0 should be < -1", target); +} +if (!(("" + (0 === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 20: 0 should be = -1", target); +} +if (!(("" + (0 > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 21: 0 should be > -1", target); +} +if (!(("" + ("0".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 22: 0 should be < true", target); +} +if (!(("" + ("0".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 23: 0 should be = true", target); +} +if (!(("" + ("0".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 24: 0 should be > true", target); +} +if (!(("" + ("0".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 25: 0 should be < false", target); +} +if (!(("" + ("0".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 26: 0 should be = false", target); +} +if (!(("" + ("0".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 27: 0 should be > false", target); +} +if (!(("" + ("0".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 28: 0 should be < NaN", target); +} +if (!(("" + ("0".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 29: 0 should be = NaN", target); +} +if (!(("" + ("0".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 30: 0 should be > NaN", target); +} +if (!(("" + (0 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 31: 0 should be < Infinity", target); +} +if (!(("" + (0 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 32: 0 should be = Infinity", target); +} +if (!(("" + (0 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 33: 0 should be > Infinity", target); +} +if (!(("" + ("0".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 34: 0 should be < banana", target); +} +if (!(("" + ("0".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 35: 0 should be = banana", target); +} +if (!(("" + ("0".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 36: 0 should be > banana", target); +} +if (!(("" + ("0".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 37: 0 should be < 🎉", target); +} +if (!(("" + ("0".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 38: 0 should be = 🎉", target); +} +if (!(("" + ("0".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 39: 0 should be > 🎉", target); +} +if (!(("" + ("0".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 40: 0 should be < ", target); +} +if (!(("" + ("0".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 41: 0 should be = ", target); +} +if (!(("" + ("0".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 42: 0 should be > ", target); +} +if (!(("" + (0 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 43: 0.0 should be < 0", target); +} +if (!(("" + (0 === 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 44: 0.0 should be = 0", target); +} +if (!(("" + (0 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 45: 0.0 should be > 0", target); +} +if (!(("" + (0 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 46: 0.0 should be < 0.0", target); +} +if (!(("" + (0 === 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 47: 0.0 should be = 0.0", target); +} +if (!(("" + (0 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 48: 0.0 should be > 0.0", target); +} +if (!(("" + (0 < 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 49: 0.0 should be < 1.23", target); +} +if (!(("" + (0 === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 50: 0.0 should be = 1.23", target); +} +if (!(("" + (0 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 51: 0.0 should be > 1.23", target); +} +if (!(("" + (0 < 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 52: 0.0 should be < .23", target); +} +if (!(("" + (0 === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 53: 0.0 should be = .23", target); +} +if (!(("" + (0 > 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 54: 0.0 should be > .23", target); +} +if (!(("" + (0 < 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 55: 0.0 should be < 0.123", target); +} +if (!(("" + (0 === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 56: 0.0 should be = 0.123", target); +} +if (!(("" + (0 > 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 57: 0.0 should be > 0.123", target); +} +if (!(("" + (0 < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 58: 0.0 should be < -0", target); +} +if (!(("" + (0 === -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 59: 0.0 should be = -0", target); +} +if (!(("" + (0 > -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 60: 0.0 should be > -0", target); +} +if (!(("" + (0 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 61: 0.0 should be < -1", target); +} +if (!(("" + (0 === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 62: 0.0 should be = -1", target); +} +if (!(("" + (0 > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 63: 0.0 should be > -1", target); +} +if (!(("" + ("0.0".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 64: 0.0 should be < true", target); +} +if (!(("" + ("0.0".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 65: 0.0 should be = true", target); +} +if (!(("" + ("0.0".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 66: 0.0 should be > true", target); +} +if (!(("" + ("0.0".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 67: 0.0 should be < false", target); +} +if (!(("" + ("0.0".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 68: 0.0 should be = false", target); +} +if (!(("" + ("0.0".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 69: 0.0 should be > false", target); +} +if (!(("" + ("0.0".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 70: 0.0 should be < NaN", target); +} +if (!(("" + ("0.0".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 71: 0.0 should be = NaN", target); +} +if (!(("" + ("0.0".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 72: 0.0 should be > NaN", target); +} +if (!(("" + (0 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 73: 0.0 should be < Infinity", target); +} +if (!(("" + (0 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 74: 0.0 should be = Infinity", target); +} +if (!(("" + (0 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 75: 0.0 should be > Infinity", target); +} +if (!(("" + ("0.0".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 76: 0.0 should be < banana", target); +} +if (!(("" + ("0.0".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 77: 0.0 should be = banana", target); +} +if (!(("" + ("0.0".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 78: 0.0 should be > banana", target); +} +if (!(("" + ("0.0".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 79: 0.0 should be < 🎉", target); +} +if (!(("" + ("0.0".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 80: 0.0 should be = 🎉", target); +} +if (!(("" + ("0.0".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 81: 0.0 should be > 🎉", target); +} +if (!(("" + ("0.0".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 82: 0.0 should be < ", target); +} +if (!(("" + ("0.0".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 83: 0.0 should be = ", target); +} +if (!(("" + ("0.0".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 84: 0.0 should be > ", target); +} +if (!(("" + (1.23 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 85: 1.23 should be < 0", target); +} +if (!(("" + (1.23 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 86: 1.23 should be = 0", target); +} +if (!(("" + (1.23 > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 87: 1.23 should be > 0", target); +} +if (!(("" + (1.23 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 88: 1.23 should be < 0.0", target); +} +if (!(("" + (1.23 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 89: 1.23 should be = 0.0", target); +} +if (!(("" + (1.23 > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 90: 1.23 should be > 0.0", target); +} +if (!(("" + (1.23 < 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 91: 1.23 should be < 1.23", target); +} +if (!(("" + (1.23 === 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 92: 1.23 should be = 1.23", target); +} +if (!(("" + (1.23 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 93: 1.23 should be > 1.23", target); +} +if (!(("" + (1.23 < 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 94: 1.23 should be < .23", target); +} +if (!(("" + (1.23 === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 95: 1.23 should be = .23", target); +} +if (!(("" + (1.23 > 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 96: 1.23 should be > .23", target); +} +if (!(("" + (1.23 < 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 97: 1.23 should be < 0.123", target); +} +if (!(("" + (1.23 === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 98: 1.23 should be = 0.123", target); +} +if (!(("" + (1.23 > 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 99: 1.23 should be > 0.123", target); +} +if (!(("" + (1.23 < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 100: 1.23 should be < -0", target); +} +if (!(("" + (1.23 === -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 101: 1.23 should be = -0", target); +} +if (!(("" + (1.23 > -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 102: 1.23 should be > -0", target); +} +if (!(("" + (1.23 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 103: 1.23 should be < -1", target); +} +if (!(("" + (1.23 === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 104: 1.23 should be = -1", target); +} +if (!(("" + (1.23 > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 105: 1.23 should be > -1", target); +} +if (!(("" + ("1.23".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 106: 1.23 should be < true", target); +} +if (!(("" + ("1.23".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 107: 1.23 should be = true", target); +} +if (!(("" + ("1.23".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 108: 1.23 should be > true", target); +} +if (!(("" + ("1.23".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 109: 1.23 should be < false", target); +} +if (!(("" + ("1.23".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 110: 1.23 should be = false", target); +} +if (!(("" + ("1.23".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 111: 1.23 should be > false", target); +} +if (!(("" + ("1.23".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 112: 1.23 should be < NaN", target); +} +if (!(("" + ("1.23".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 113: 1.23 should be = NaN", target); +} +if (!(("" + ("1.23".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 114: 1.23 should be > NaN", target); +} +if (!(("" + (1.23 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 115: 1.23 should be < Infinity", target); +} +if (!(("" + (1.23 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 116: 1.23 should be = Infinity", target); +} +if (!(("" + (1.23 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 117: 1.23 should be > Infinity", target); +} +if (!(("" + ("1.23".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 118: 1.23 should be < banana", target); +} +if (!(("" + ("1.23".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 119: 1.23 should be = banana", target); +} +if (!(("" + ("1.23".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 120: 1.23 should be > banana", target); +} +if (!(("" + ("1.23".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 121: 1.23 should be < 🎉", target); +} +if (!(("" + ("1.23".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 122: 1.23 should be = 🎉", target); +} +if (!(("" + ("1.23".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 123: 1.23 should be > 🎉", target); +} +if (!(("" + ("1.23".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 124: 1.23 should be < ", target); +} +if (!(("" + ("1.23".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 125: 1.23 should be = ", target); +} +if (!(("" + ("1.23".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 126: 1.23 should be > ", target); +} +if (!(("" + (0.23 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 127: .23 should be < 0", target); +} +if (!(("" + (0.23 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 128: .23 should be = 0", target); +} +if (!(("" + (0.23 > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 129: .23 should be > 0", target); +} +if (!(("" + (0.23 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 130: .23 should be < 0.0", target); +} +if (!(("" + (0.23 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 131: .23 should be = 0.0", target); +} +if (!(("" + (0.23 > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 132: .23 should be > 0.0", target); +} +if (!(("" + (0.23 < 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 133: .23 should be < 1.23", target); +} +if (!(("" + (0.23 === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 134: .23 should be = 1.23", target); +} +if (!(("" + (0.23 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 135: .23 should be > 1.23", target); +} +if (!(("" + (0.23 < 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 136: .23 should be < .23", target); +} +if (!(("" + (0.23 === 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 137: .23 should be = .23", target); +} +if (!(("" + (0.23 > 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 138: .23 should be > .23", target); +} +if (!(("" + (0.23 < 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 139: .23 should be < 0.123", target); +} +if (!(("" + (0.23 === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 140: .23 should be = 0.123", target); +} +if (!(("" + (0.23 > 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 141: .23 should be > 0.123", target); +} +if (!(("" + (0.23 < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 142: .23 should be < -0", target); +} +if (!(("" + (0.23 === -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 143: .23 should be = -0", target); +} +if (!(("" + (0.23 > -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 144: .23 should be > -0", target); +} +if (!(("" + (0.23 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 145: .23 should be < -1", target); +} +if (!(("" + (0.23 === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 146: .23 should be = -1", target); +} +if (!(("" + (0.23 > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 147: .23 should be > -1", target); +} +if (!(("" + (".23".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 148: .23 should be < true", target); +} +if (!(("" + (".23".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 149: .23 should be = true", target); +} +if (!(("" + (".23".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 150: .23 should be > true", target); +} +if (!(("" + (".23".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 151: .23 should be < false", target); +} +if (!(("" + (".23".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 152: .23 should be = false", target); +} +if (!(("" + (".23".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 153: .23 should be > false", target); +} +if (!(("" + (".23".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 154: .23 should be < NaN", target); +} +if (!(("" + (".23".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 155: .23 should be = NaN", target); +} +if (!(("" + (".23".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 156: .23 should be > NaN", target); +} +if (!(("" + (0.23 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 157: .23 should be < Infinity", target); +} +if (!(("" + (0.23 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 158: .23 should be = Infinity", target); +} +if (!(("" + (0.23 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 159: .23 should be > Infinity", target); +} +if (!(("" + (".23".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 160: .23 should be < banana", target); +} +if (!(("" + (".23".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 161: .23 should be = banana", target); +} +if (!(("" + (".23".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 162: .23 should be > banana", target); +} +if (!(("" + (".23".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 163: .23 should be < 🎉", target); +} +if (!(("" + (".23".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 164: .23 should be = 🎉", target); +} +if (!(("" + (".23".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 165: .23 should be > 🎉", target); +} +if (!(("" + (".23".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 166: .23 should be < ", target); +} +if (!(("" + (".23".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 167: .23 should be = ", target); +} +if (!(("" + (".23".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 168: .23 should be > ", target); +} +if (!(("" + (0.123 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 169: 0.123 should be < 0", target); +} +if (!(("" + (0.123 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 170: 0.123 should be = 0", target); +} +if (!(("" + (0.123 > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 171: 0.123 should be > 0", target); +} +if (!(("" + (0.123 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 172: 0.123 should be < 0.0", target); +} +if (!(("" + (0.123 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 173: 0.123 should be = 0.0", target); +} +if (!(("" + (0.123 > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 174: 0.123 should be > 0.0", target); +} +if (!(("" + (0.123 < 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 175: 0.123 should be < 1.23", target); +} +if (!(("" + (0.123 === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 176: 0.123 should be = 1.23", target); +} +if (!(("" + (0.123 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 177: 0.123 should be > 1.23", target); +} +if (!(("" + (0.123 < 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 178: 0.123 should be < .23", target); +} +if (!(("" + (0.123 === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 179: 0.123 should be = .23", target); +} +if (!(("" + (0.123 > 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 180: 0.123 should be > .23", target); +} +if (!(("" + (0.123 < 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 181: 0.123 should be < 0.123", target); +} +if (!(("" + (0.123 === 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 182: 0.123 should be = 0.123", target); +} +if (!(("" + (0.123 > 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 183: 0.123 should be > 0.123", target); +} +if (!(("" + (0.123 < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 184: 0.123 should be < -0", target); +} +if (!(("" + (0.123 === -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 185: 0.123 should be = -0", target); +} +if (!(("" + (0.123 > -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 186: 0.123 should be > -0", target); +} +if (!(("" + (0.123 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 187: 0.123 should be < -1", target); +} +if (!(("" + (0.123 === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 188: 0.123 should be = -1", target); +} +if (!(("" + (0.123 > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 189: 0.123 should be > -1", target); +} +if (!(("" + ("0.123".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 190: 0.123 should be < true", target); +} +if (!(("" + ("0.123".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 191: 0.123 should be = true", target); +} +if (!(("" + ("0.123".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 192: 0.123 should be > true", target); +} +if (!(("" + ("0.123".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 193: 0.123 should be < false", target); +} +if (!(("" + ("0.123".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 194: 0.123 should be = false", target); +} +if (!(("" + ("0.123".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 195: 0.123 should be > false", target); +} +if (!(("" + ("0.123".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 196: 0.123 should be < NaN", target); +} +if (!(("" + ("0.123".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 197: 0.123 should be = NaN", target); +} +if (!(("" + ("0.123".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 198: 0.123 should be > NaN", target); +} +if (!(("" + (0.123 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 199: 0.123 should be < Infinity", target); +} +if (!(("" + (0.123 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 200: 0.123 should be = Infinity", target); +} +if (!(("" + (0.123 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 201: 0.123 should be > Infinity", target); +} +if (!(("" + ("0.123".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 202: 0.123 should be < banana", target); +} +if (!(("" + ("0.123".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 203: 0.123 should be = banana", target); +} +if (!(("" + ("0.123".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 204: 0.123 should be > banana", target); +} +if (!(("" + ("0.123".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 205: 0.123 should be < 🎉", target); +} +if (!(("" + ("0.123".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 206: 0.123 should be = 🎉", target); +} +if (!(("" + ("0.123".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 207: 0.123 should be > 🎉", target); +} +if (!(("" + ("0.123".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 208: 0.123 should be < ", target); +} +if (!(("" + ("0.123".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 209: 0.123 should be = ", target); +} +if (!(("" + ("0.123".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 210: 0.123 should be > ", target); +} +if (!(("" + (-0 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 211: -0 should be < 0", target); +} +if (!(("" + (-0 === 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 212: -0 should be = 0", target); +} +if (!(("" + (-0 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 213: -0 should be > 0", target); +} +if (!(("" + (-0 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 214: -0 should be < 0.0", target); +} +if (!(("" + (-0 === 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 215: -0 should be = 0.0", target); +} +if (!(("" + (-0 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 216: -0 should be > 0.0", target); +} +if (!(("" + (-0 < 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 217: -0 should be < 1.23", target); +} +if (!(("" + (-0 === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 218: -0 should be = 1.23", target); +} +if (!(("" + (-0 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 219: -0 should be > 1.23", target); +} +if (!(("" + (-0 < 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 220: -0 should be < .23", target); +} +if (!(("" + (-0 === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 221: -0 should be = .23", target); +} +if (!(("" + (-0 > 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 222: -0 should be > .23", target); +} +if (!(("" + (-0 < 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 223: -0 should be < 0.123", target); +} +if (!(("" + (-0 === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 224: -0 should be = 0.123", target); +} +if (!(("" + (-0 > 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 225: -0 should be > 0.123", target); +} +if (!(("" + (-0 < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 226: -0 should be < -0", target); +} +if (!(("" + (-0 === -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 227: -0 should be = -0", target); +} +if (!(("" + (-0 > -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 228: -0 should be > -0", target); +} +if (!(("" + (-0 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 229: -0 should be < -1", target); +} +if (!(("" + (-0 === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 230: -0 should be = -1", target); +} +if (!(("" + (-0 > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 231: -0 should be > -1", target); +} +if (!(("" + ("-0".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 232: -0 should be < true", target); +} +if (!(("" + ("-0".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 233: -0 should be = true", target); +} +if (!(("" + ("-0".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 234: -0 should be > true", target); +} +if (!(("" + ("-0".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 235: -0 should be < false", target); +} +if (!(("" + ("-0".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 236: -0 should be = false", target); +} +if (!(("" + ("-0".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 237: -0 should be > false", target); +} +if (!(("" + ("-0".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 238: -0 should be < NaN", target); +} +if (!(("" + ("-0".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 239: -0 should be = NaN", target); +} +if (!(("" + ("-0".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 240: -0 should be > NaN", target); +} +if (!(("" + (-0 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 241: -0 should be < Infinity", target); +} +if (!(("" + (-0 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 242: -0 should be = Infinity", target); +} +if (!(("" + (-0 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 243: -0 should be > Infinity", target); +} +if (!(("" + ("-0".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 244: -0 should be < banana", target); +} +if (!(("" + ("-0".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 245: -0 should be = banana", target); +} +if (!(("" + ("-0".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 246: -0 should be > banana", target); +} +if (!(("" + ("-0".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 247: -0 should be < 🎉", target); +} +if (!(("" + ("-0".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 248: -0 should be = 🎉", target); +} +if (!(("" + ("-0".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 249: -0 should be > 🎉", target); +} +if (!(("" + ("-0".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 250: -0 should be < ", target); +} +if (!(("" + ("-0".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 251: -0 should be = ", target); +} +if (!(("" + ("-0".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 252: -0 should be > ", target); +} +if (!(("" + (-1 < 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 253: -1 should be < 0", target); +} +if (!(("" + (-1 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 254: -1 should be = 0", target); +} +if (!(("" + (-1 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 255: -1 should be > 0", target); +} +if (!(("" + (-1 < 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 256: -1 should be < 0.0", target); +} +if (!(("" + (-1 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 257: -1 should be = 0.0", target); +} +if (!(("" + (-1 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 258: -1 should be > 0.0", target); +} +if (!(("" + (-1 < 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 259: -1 should be < 1.23", target); +} +if (!(("" + (-1 === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 260: -1 should be = 1.23", target); +} +if (!(("" + (-1 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 261: -1 should be > 1.23", target); +} +if (!(("" + (-1 < 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 262: -1 should be < .23", target); +} +if (!(("" + (-1 === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 263: -1 should be = .23", target); +} +if (!(("" + (-1 > 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 264: -1 should be > .23", target); +} +if (!(("" + (-1 < 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 265: -1 should be < 0.123", target); +} +if (!(("" + (-1 === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 266: -1 should be = 0.123", target); +} +if (!(("" + (-1 > 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 267: -1 should be > 0.123", target); +} +if (!(("" + (-1 < -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 268: -1 should be < -0", target); +} +if (!(("" + (-1 === -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 269: -1 should be = -0", target); +} +if (!(("" + (-1 > -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 270: -1 should be > -0", target); +} +if (!(("" + (-1 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 271: -1 should be < -1", target); +} +if (!(("" + (-1 === -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 272: -1 should be = -1", target); +} +if (!(("" + (-1 > -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 273: -1 should be > -1", target); +} +if (!(("" + ("-1".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 274: -1 should be < true", target); +} +if (!(("" + ("-1".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 275: -1 should be = true", target); +} +if (!(("" + ("-1".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 276: -1 should be > true", target); +} +if (!(("" + ("-1".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 277: -1 should be < false", target); +} +if (!(("" + ("-1".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 278: -1 should be = false", target); +} +if (!(("" + ("-1".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 279: -1 should be > false", target); +} +if (!(("" + ("-1".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 280: -1 should be < NaN", target); +} +if (!(("" + ("-1".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 281: -1 should be = NaN", target); +} +if (!(("" + ("-1".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 282: -1 should be > NaN", target); +} +if (!(("" + (-1 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 283: -1 should be < Infinity", target); +} +if (!(("" + (-1 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 284: -1 should be = Infinity", target); +} +if (!(("" + (-1 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 285: -1 should be > Infinity", target); +} +if (!(("" + ("-1".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 286: -1 should be < banana", target); +} +if (!(("" + ("-1".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 287: -1 should be = banana", target); +} +if (!(("" + ("-1".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 288: -1 should be > banana", target); +} +if (!(("" + ("-1".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 289: -1 should be < 🎉", target); +} +if (!(("" + ("-1".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 290: -1 should be = 🎉", target); +} +if (!(("" + ("-1".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 291: -1 should be > 🎉", target); +} +if (!(("" + ("-1".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 292: -1 should be < ", target); +} +if (!(("" + ("-1".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 293: -1 should be = ", target); +} +if (!(("" + ("-1".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 294: -1 should be > ", target); +} +if (!(("" + ("true".toLowerCase() < "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 295: true should be < 0", target); +} +if (!(("" + ("true".toLowerCase() === "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 296: true should be = 0", target); +} +if (!(("" + ("true".toLowerCase() > "0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 297: true should be > 0", target); +} +if (!(("" + ("true".toLowerCase() < "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 298: true should be < 0.0", target); +} +if (!(("" + ("true".toLowerCase() === "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 299: true should be = 0.0", target); +} +if (!(("" + ("true".toLowerCase() > "0.0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 300: true should be > 0.0", target); +} +if (!(("" + ("true".toLowerCase() < "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 301: true should be < 1.23", target); +} +if (!(("" + ("true".toLowerCase() === "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 302: true should be = 1.23", target); +} +if (!(("" + ("true".toLowerCase() > "1.23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 303: true should be > 1.23", target); +} +if (!(("" + ("true".toLowerCase() < ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 304: true should be < .23", target); +} +if (!(("" + ("true".toLowerCase() === ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 305: true should be = .23", target); +} +if (!(("" + ("true".toLowerCase() > ".23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 306: true should be > .23", target); +} +if (!(("" + ("true".toLowerCase() < "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 307: true should be < 0.123", target); +} +if (!(("" + ("true".toLowerCase() === "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 308: true should be = 0.123", target); +} +if (!(("" + ("true".toLowerCase() > "0.123".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 309: true should be > 0.123", target); +} +if (!(("" + ("true".toLowerCase() < "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 310: true should be < -0", target); +} +if (!(("" + ("true".toLowerCase() === "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 311: true should be = -0", target); +} +if (!(("" + ("true".toLowerCase() > "-0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 312: true should be > -0", target); +} +if (!(("" + ("true".toLowerCase() < "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 313: true should be < -1", target); +} +if (!(("" + ("true".toLowerCase() === "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 314: true should be = -1", target); +} +if (!(("" + ("true".toLowerCase() > "-1".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 315: true should be > -1", target); +} +if (!(("" + ("true".toLowerCase() < "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 316: true should be < true", target); +} +if (!(("" + ("true".toLowerCase() === "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 317: true should be = true", target); +} +if (!(("" + ("true".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 318: true should be > true", target); +} +if (!(("" + ("true".toLowerCase() < "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 319: true should be < false", target); +} +if (!(("" + ("true".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 320: true should be = false", target); +} +if (!(("" + ("true".toLowerCase() > "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 321: true should be > false", target); +} +if (!(("" + ("true".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 322: true should be < NaN", target); +} +if (!(("" + ("true".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 323: true should be = NaN", target); +} +if (!(("" + ("true".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 324: true should be > NaN", target); +} +if (!(("" + ("true".toLowerCase() < "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 325: true should be < Infinity", target); +} +if (!(("" + ("true".toLowerCase() === "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 326: true should be = Infinity", target); +} +if (!(("" + ("true".toLowerCase() > "Infinity".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 327: true should be > Infinity", target); +} +if (!(("" + ("true".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 328: true should be < banana", target); +} +if (!(("" + ("true".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 329: true should be = banana", target); +} +if (!(("" + ("true".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 330: true should be > banana", target); +} +if (!(("" + ("true".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 331: true should be < 🎉", target); +} +if (!(("" + ("true".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 332: true should be = 🎉", target); +} +if (!(("" + ("true".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 333: true should be > 🎉", target); +} +if (!(("" + ("true".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 334: true should be < ", target); +} +if (!(("" + ("true".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 335: true should be = ", target); +} +if (!(("" + ("true".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 336: true should be > ", target); +} +if (!(("" + ("false".toLowerCase() < "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 337: false should be < 0", target); +} +if (!(("" + ("false".toLowerCase() === "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 338: false should be = 0", target); +} +if (!(("" + ("false".toLowerCase() > "0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 339: false should be > 0", target); +} +if (!(("" + ("false".toLowerCase() < "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 340: false should be < 0.0", target); +} +if (!(("" + ("false".toLowerCase() === "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 341: false should be = 0.0", target); +} +if (!(("" + ("false".toLowerCase() > "0.0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 342: false should be > 0.0", target); +} +if (!(("" + ("false".toLowerCase() < "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 343: false should be < 1.23", target); +} +if (!(("" + ("false".toLowerCase() === "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 344: false should be = 1.23", target); +} +if (!(("" + ("false".toLowerCase() > "1.23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 345: false should be > 1.23", target); +} +if (!(("" + ("false".toLowerCase() < ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 346: false should be < .23", target); +} +if (!(("" + ("false".toLowerCase() === ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 347: false should be = .23", target); +} +if (!(("" + ("false".toLowerCase() > ".23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 348: false should be > .23", target); +} +if (!(("" + ("false".toLowerCase() < "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 349: false should be < 0.123", target); +} +if (!(("" + ("false".toLowerCase() === "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 350: false should be = 0.123", target); +} +if (!(("" + ("false".toLowerCase() > "0.123".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 351: false should be > 0.123", target); +} +if (!(("" + ("false".toLowerCase() < "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 352: false should be < -0", target); +} +if (!(("" + ("false".toLowerCase() === "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 353: false should be = -0", target); +} +if (!(("" + ("false".toLowerCase() > "-0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 354: false should be > -0", target); +} +if (!(("" + ("false".toLowerCase() < "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 355: false should be < -1", target); +} +if (!(("" + ("false".toLowerCase() === "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 356: false should be = -1", target); +} +if (!(("" + ("false".toLowerCase() > "-1".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 357: false should be > -1", target); +} +if (!(("" + ("false".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 358: false should be < true", target); +} +if (!(("" + ("false".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 359: false should be = true", target); +} +if (!(("" + ("false".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 360: false should be > true", target); +} +if (!(("" + ("false".toLowerCase() < "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 361: false should be < false", target); +} +if (!(("" + ("false".toLowerCase() === "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 362: false should be = false", target); +} +if (!(("" + ("false".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 363: false should be > false", target); +} +if (!(("" + ("false".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 364: false should be < NaN", target); +} +if (!(("" + ("false".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 365: false should be = NaN", target); +} +if (!(("" + ("false".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 366: false should be > NaN", target); +} +if (!(("" + ("false".toLowerCase() < "Infinity".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 367: false should be < Infinity", target); +} +if (!(("" + ("false".toLowerCase() === "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 368: false should be = Infinity", target); +} +if (!(("" + ("false".toLowerCase() > "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 369: false should be > Infinity", target); +} +if (!(("" + ("false".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 370: false should be < banana", target); +} +if (!(("" + ("false".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 371: false should be = banana", target); +} +if (!(("" + ("false".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 372: false should be > banana", target); +} +if (!(("" + ("false".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 373: false should be < 🎉", target); +} +if (!(("" + ("false".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 374: false should be = 🎉", target); +} +if (!(("" + ("false".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 375: false should be > 🎉", target); +} +if (!(("" + ("false".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 376: false should be < ", target); +} +if (!(("" + ("false".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 377: false should be = ", target); +} +if (!(("" + ("false".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 378: false should be > ", target); +} +if (!(("" + ("NaN".toLowerCase() < "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 379: NaN should be < 0", target); +} +if (!(("" + ("NaN".toLowerCase() === "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 380: NaN should be = 0", target); +} +if (!(("" + ("NaN".toLowerCase() > "0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 381: NaN should be > 0", target); +} +if (!(("" + ("NaN".toLowerCase() < "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 382: NaN should be < 0.0", target); +} +if (!(("" + ("NaN".toLowerCase() === "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 383: NaN should be = 0.0", target); +} +if (!(("" + ("NaN".toLowerCase() > "0.0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 384: NaN should be > 0.0", target); +} +if (!(("" + ("NaN".toLowerCase() < "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 385: NaN should be < 1.23", target); +} +if (!(("" + ("NaN".toLowerCase() === "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 386: NaN should be = 1.23", target); +} +if (!(("" + ("NaN".toLowerCase() > "1.23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 387: NaN should be > 1.23", target); +} +if (!(("" + ("NaN".toLowerCase() < ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 388: NaN should be < .23", target); +} +if (!(("" + ("NaN".toLowerCase() === ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 389: NaN should be = .23", target); +} +if (!(("" + ("NaN".toLowerCase() > ".23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 390: NaN should be > .23", target); +} +if (!(("" + ("NaN".toLowerCase() < "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 391: NaN should be < 0.123", target); +} +if (!(("" + ("NaN".toLowerCase() === "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 392: NaN should be = 0.123", target); +} +if (!(("" + ("NaN".toLowerCase() > "0.123".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 393: NaN should be > 0.123", target); +} +if (!(("" + ("NaN".toLowerCase() < "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 394: NaN should be < -0", target); +} +if (!(("" + ("NaN".toLowerCase() === "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 395: NaN should be = -0", target); +} +if (!(("" + ("NaN".toLowerCase() > "-0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 396: NaN should be > -0", target); +} +if (!(("" + ("NaN".toLowerCase() < "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 397: NaN should be < -1", target); +} +if (!(("" + ("NaN".toLowerCase() === "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 398: NaN should be = -1", target); +} +if (!(("" + ("NaN".toLowerCase() > "-1".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 399: NaN should be > -1", target); +} +if (!(("" + ("NaN".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 400: NaN should be < true", target); +} +if (!(("" + ("NaN".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 401: NaN should be = true", target); +} +if (!(("" + ("NaN".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 402: NaN should be > true", target); +} +if (!(("" + ("NaN".toLowerCase() < "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 403: NaN should be < false", target); +} +if (!(("" + ("NaN".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 404: NaN should be = false", target); +} +if (!(("" + ("NaN".toLowerCase() > "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 405: NaN should be > false", target); +} +if (!(("" + ("NaN".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 406: NaN should be < NaN", target); +} +if (!(("" + ("NaN".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 407: NaN should be = NaN", target); +} +if (!(("" + ("NaN".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 408: NaN should be > NaN", target); +} +if (!(("" + ("NaN".toLowerCase() < "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 409: NaN should be < Infinity", target); +} +if (!(("" + ("NaN".toLowerCase() === "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 410: NaN should be = Infinity", target); +} +if (!(("" + ("NaN".toLowerCase() > "Infinity".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 411: NaN should be > Infinity", target); +} +if (!(("" + ("NaN".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 412: NaN should be < banana", target); +} +if (!(("" + ("NaN".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 413: NaN should be = banana", target); +} +if (!(("" + ("NaN".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 414: NaN should be > banana", target); +} +if (!(("" + ("NaN".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 415: NaN should be < 🎉", target); +} +if (!(("" + ("NaN".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 416: NaN should be = 🎉", target); +} +if (!(("" + ("NaN".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 417: NaN should be > 🎉", target); +} +if (!(("" + ("NaN".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 418: NaN should be < ", target); +} +if (!(("" + ("NaN".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 419: NaN should be = ", target); +} +if (!(("" + ("NaN".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 420: NaN should be > ", target); +} +if (!(("" + (Infinity < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 421: Infinity should be < 0", target); +} +if (!(("" + (Infinity === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 422: Infinity should be = 0", target); +} +if (!(("" + (Infinity > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 423: Infinity should be > 0", target); +} +if (!(("" + (Infinity < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 424: Infinity should be < 0.0", target); +} +if (!(("" + (Infinity === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 425: Infinity should be = 0.0", target); +} +if (!(("" + (Infinity > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 426: Infinity should be > 0.0", target); +} +if (!(("" + (Infinity < 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 427: Infinity should be < 1.23", target); +} +if (!(("" + (Infinity === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 428: Infinity should be = 1.23", target); +} +if (!(("" + (Infinity > 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 429: Infinity should be > 1.23", target); +} +if (!(("" + (Infinity < 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 430: Infinity should be < .23", target); +} +if (!(("" + (Infinity === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 431: Infinity should be = .23", target); +} +if (!(("" + (Infinity > 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 432: Infinity should be > .23", target); +} +if (!(("" + (Infinity < 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 433: Infinity should be < 0.123", target); +} +if (!(("" + (Infinity === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 434: Infinity should be = 0.123", target); +} +if (!(("" + (Infinity > 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 435: Infinity should be > 0.123", target); +} +if (!(("" + (Infinity < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 436: Infinity should be < -0", target); +} +if (!(("" + (Infinity === -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 437: Infinity should be = -0", target); +} +if (!(("" + (Infinity > -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 438: Infinity should be > -0", target); +} +if (!(("" + (Infinity < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 439: Infinity should be < -1", target); +} +if (!(("" + (Infinity === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 440: Infinity should be = -1", target); +} +if (!(("" + (Infinity > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 441: Infinity should be > -1", target); +} +if (!(("" + ("Infinity".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 442: Infinity should be < true", target); +} +if (!(("" + ("Infinity".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 443: Infinity should be = true", target); +} +if (!(("" + ("Infinity".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 444: Infinity should be > true", target); +} +if (!(("" + ("Infinity".toLowerCase() < "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 445: Infinity should be < false", target); +} +if (!(("" + ("Infinity".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 446: Infinity should be = false", target); +} +if (!(("" + ("Infinity".toLowerCase() > "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 447: Infinity should be > false", target); +} +if (!(("" + ("Infinity".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 448: Infinity should be < NaN", target); +} +if (!(("" + ("Infinity".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 449: Infinity should be = NaN", target); +} +if (!(("" + ("Infinity".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 450: Infinity should be > NaN", target); +} +if (!(("" + (Infinity < Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 451: Infinity should be < Infinity", target); +} +if (!(("" + (Infinity === Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 452: Infinity should be = Infinity", target); +} +if (!(("" + (Infinity > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 453: Infinity should be > Infinity", target); +} +if (!(("" + ("Infinity".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 454: Infinity should be < banana", target); +} +if (!(("" + ("Infinity".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 455: Infinity should be = banana", target); +} +if (!(("" + ("Infinity".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 456: Infinity should be > banana", target); +} +if (!(("" + ("Infinity".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 457: Infinity should be < 🎉", target); +} +if (!(("" + ("Infinity".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 458: Infinity should be = 🎉", target); +} +if (!(("" + ("Infinity".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 459: Infinity should be > 🎉", target); +} +if (!(("" + ("Infinity".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 460: Infinity should be < ", target); +} +if (!(("" + ("Infinity".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 461: Infinity should be = ", target); +} +if (!(("" + ("Infinity".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 462: Infinity should be > ", target); +} +if (!(("" + ("banana".toLowerCase() < "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 463: banana should be < 0", target); +} +if (!(("" + ("banana".toLowerCase() === "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 464: banana should be = 0", target); +} +if (!(("" + ("banana".toLowerCase() > "0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 465: banana should be > 0", target); +} +if (!(("" + ("banana".toLowerCase() < "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 466: banana should be < 0.0", target); +} +if (!(("" + ("banana".toLowerCase() === "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 467: banana should be = 0.0", target); +} +if (!(("" + ("banana".toLowerCase() > "0.0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 468: banana should be > 0.0", target); +} +if (!(("" + ("banana".toLowerCase() < "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 469: banana should be < 1.23", target); +} +if (!(("" + ("banana".toLowerCase() === "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 470: banana should be = 1.23", target); +} +if (!(("" + ("banana".toLowerCase() > "1.23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 471: banana should be > 1.23", target); +} +if (!(("" + ("banana".toLowerCase() < ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 472: banana should be < .23", target); +} +if (!(("" + ("banana".toLowerCase() === ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 473: banana should be = .23", target); +} +if (!(("" + ("banana".toLowerCase() > ".23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 474: banana should be > .23", target); +} +if (!(("" + ("banana".toLowerCase() < "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 475: banana should be < 0.123", target); +} +if (!(("" + ("banana".toLowerCase() === "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 476: banana should be = 0.123", target); +} +if (!(("" + ("banana".toLowerCase() > "0.123".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 477: banana should be > 0.123", target); +} +if (!(("" + ("banana".toLowerCase() < "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 478: banana should be < -0", target); +} +if (!(("" + ("banana".toLowerCase() === "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 479: banana should be = -0", target); +} +if (!(("" + ("banana".toLowerCase() > "-0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 480: banana should be > -0", target); +} +if (!(("" + ("banana".toLowerCase() < "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 481: banana should be < -1", target); +} +if (!(("" + ("banana".toLowerCase() === "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 482: banana should be = -1", target); +} +if (!(("" + ("banana".toLowerCase() > "-1".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 483: banana should be > -1", target); +} +if (!(("" + ("banana".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 484: banana should be < true", target); +} +if (!(("" + ("banana".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 485: banana should be = true", target); +} +if (!(("" + ("banana".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 486: banana should be > true", target); +} +if (!(("" + ("banana".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 487: banana should be < false", target); +} +if (!(("" + ("banana".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 488: banana should be = false", target); +} +if (!(("" + ("banana".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 489: banana should be > false", target); +} +if (!(("" + ("banana".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 490: banana should be < NaN", target); +} +if (!(("" + ("banana".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 491: banana should be = NaN", target); +} +if (!(("" + ("banana".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 492: banana should be > NaN", target); +} +if (!(("" + ("banana".toLowerCase() < "Infinity".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 493: banana should be < Infinity", target); +} +if (!(("" + ("banana".toLowerCase() === "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 494: banana should be = Infinity", target); +} +if (!(("" + ("banana".toLowerCase() > "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 495: banana should be > Infinity", target); +} +if (!(("" + ("banana".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 496: banana should be < banana", target); +} +if (!(("" + ("banana".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 497: banana should be = banana", target); +} +if (!(("" + ("banana".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 498: banana should be > banana", target); +} +if (!(("" + ("banana".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 499: banana should be < 🎉", target); +} +if (!(("" + ("banana".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 500: banana should be = 🎉", target); +} +if (!(("" + ("banana".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 501: banana should be > 🎉", target); +} +if (!(("" + ("banana".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 502: banana should be < ", target); +} +if (!(("" + ("banana".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 503: banana should be = ", target); +} +if (!(("" + ("banana".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 504: banana should be > ", target); +} +if (!(("" + ("🎉".toLowerCase() < "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 505: 🎉 should be < 0", target); +} +if (!(("" + ("🎉".toLowerCase() === "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 506: 🎉 should be = 0", target); +} +if (!(("" + ("🎉".toLowerCase() > "0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 507: 🎉 should be > 0", target); +} +if (!(("" + ("🎉".toLowerCase() < "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 508: 🎉 should be < 0.0", target); +} +if (!(("" + ("🎉".toLowerCase() === "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 509: 🎉 should be = 0.0", target); +} +if (!(("" + ("🎉".toLowerCase() > "0.0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 510: 🎉 should be > 0.0", target); +} +if (!(("" + ("🎉".toLowerCase() < "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 511: 🎉 should be < 1.23", target); +} +if (!(("" + ("🎉".toLowerCase() === "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 512: 🎉 should be = 1.23", target); +} +if (!(("" + ("🎉".toLowerCase() > "1.23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 513: 🎉 should be > 1.23", target); +} +if (!(("" + ("🎉".toLowerCase() < ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 514: 🎉 should be < .23", target); +} +if (!(("" + ("🎉".toLowerCase() === ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 515: 🎉 should be = .23", target); +} +if (!(("" + ("🎉".toLowerCase() > ".23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 516: 🎉 should be > .23", target); +} +if (!(("" + ("🎉".toLowerCase() < "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 517: 🎉 should be < 0.123", target); +} +if (!(("" + ("🎉".toLowerCase() === "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 518: 🎉 should be = 0.123", target); +} +if (!(("" + ("🎉".toLowerCase() > "0.123".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 519: 🎉 should be > 0.123", target); +} +if (!(("" + ("🎉".toLowerCase() < "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 520: 🎉 should be < -0", target); +} +if (!(("" + ("🎉".toLowerCase() === "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 521: 🎉 should be = -0", target); +} +if (!(("" + ("🎉".toLowerCase() > "-0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 522: 🎉 should be > -0", target); +} +if (!(("" + ("🎉".toLowerCase() < "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 523: 🎉 should be < -1", target); +} +if (!(("" + ("🎉".toLowerCase() === "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 524: 🎉 should be = -1", target); +} +if (!(("" + ("🎉".toLowerCase() > "-1".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 525: 🎉 should be > -1", target); +} +if (!(("" + ("🎉".toLowerCase() < "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 526: 🎉 should be < true", target); +} +if (!(("" + ("🎉".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 527: 🎉 should be = true", target); +} +if (!(("" + ("🎉".toLowerCase() > "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 528: 🎉 should be > true", target); +} +if (!(("" + ("🎉".toLowerCase() < "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 529: 🎉 should be < false", target); +} +if (!(("" + ("🎉".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 530: 🎉 should be = false", target); +} +if (!(("" + ("🎉".toLowerCase() > "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 531: 🎉 should be > false", target); +} +if (!(("" + ("🎉".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 532: 🎉 should be < NaN", target); +} +if (!(("" + ("🎉".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 533: 🎉 should be = NaN", target); +} +if (!(("" + ("🎉".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 534: 🎉 should be > NaN", target); +} +if (!(("" + ("🎉".toLowerCase() < "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 535: 🎉 should be < Infinity", target); +} +if (!(("" + ("🎉".toLowerCase() === "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 536: 🎉 should be = Infinity", target); +} +if (!(("" + ("🎉".toLowerCase() > "Infinity".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 537: 🎉 should be > Infinity", target); +} +if (!(("" + ("🎉".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 538: 🎉 should be < banana", target); +} +if (!(("" + ("🎉".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 539: 🎉 should be = banana", target); +} +if (!(("" + ("🎉".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 540: 🎉 should be > banana", target); +} +if (!(("" + ("🎉".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 541: 🎉 should be < 🎉", target); +} +if (!(("" + ("🎉".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 542: 🎉 should be = 🎉", target); +} +if (!(("" + ("🎉".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 543: 🎉 should be > 🎉", target); +} +if (!(("" + ("🎉".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 544: 🎉 should be < ", target); +} +if (!(("" + ("🎉".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 545: 🎉 should be = ", target); +} +if (!(("" + ("🎉".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 546: 🎉 should be > ", target); +} +if (!(("" + ("".toLowerCase() < "0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 547: should be < 0", target); +} +if (!(("" + ("".toLowerCase() === "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 548: should be = 0", target); +} +if (!(("" + ("".toLowerCase() > "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 549: should be > 0", target); +} +if (!(("" + ("".toLowerCase() < "0.0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 550: should be < 0.0", target); +} +if (!(("" + ("".toLowerCase() === "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 551: should be = 0.0", target); +} +if (!(("" + ("".toLowerCase() > "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 552: should be > 0.0", target); +} +if (!(("" + ("".toLowerCase() < "1.23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 553: should be < 1.23", target); +} +if (!(("" + ("".toLowerCase() === "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 554: should be = 1.23", target); +} +if (!(("" + ("".toLowerCase() > "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 555: should be > 1.23", target); +} +if (!(("" + ("".toLowerCase() < ".23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 556: should be < .23", target); +} +if (!(("" + ("".toLowerCase() === ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 557: should be = .23", target); +} +if (!(("" + ("".toLowerCase() > ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 558: should be > .23", target); +} +if (!(("" + ("".toLowerCase() < "0.123".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 559: should be < 0.123", target); +} +if (!(("" + ("".toLowerCase() === "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 560: should be = 0.123", target); +} +if (!(("" + ("".toLowerCase() > "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 561: should be > 0.123", target); +} +if (!(("" + ("".toLowerCase() < "-0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 562: should be < -0", target); +} +if (!(("" + ("".toLowerCase() === "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 563: should be = -0", target); +} +if (!(("" + ("".toLowerCase() > "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 564: should be > -0", target); +} +if (!(("" + ("".toLowerCase() < "-1".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 565: should be < -1", target); +} +if (!(("" + ("".toLowerCase() === "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 566: should be = -1", target); +} +if (!(("" + ("".toLowerCase() > "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 567: should be > -1", target); +} +if (!(("" + ("".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 568: should be < true", target); +} +if (!(("" + ("".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 569: should be = true", target); +} +if (!(("" + ("".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 570: should be > true", target); +} +if (!(("" + ("".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 571: should be < false", target); +} +if (!(("" + ("".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 572: should be = false", target); +} +if (!(("" + ("".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 573: should be > false", target); +} +if (!(("" + ("".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 574: should be < NaN", target); +} +if (!(("" + ("".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 575: should be = NaN", target); +} +if (!(("" + ("".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 576: should be > NaN", target); +} +if (!(("" + ("".toLowerCase() < "Infinity".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 577: should be < Infinity", target); +} +if (!(("" + ("".toLowerCase() === "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 578: should be = Infinity", target); +} +if (!(("" + ("".toLowerCase() > "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 579: should be > Infinity", target); +} +if (!(("" + ("".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 580: should be < banana", target); +} +if (!(("" + ("".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 581: should be = banana", target); +} +if (!(("" + ("".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 582: should be > banana", target); +} +if (!(("" + ("".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 583: should be < 🎉", target); +} +if (!(("" + ("".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 584: should be = 🎉", target); +} +if (!(("" + ("".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 585: should be > 🎉", target); +} +if (!(("" + ("".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 586: should be < ", target); +} +if (!(("" + ("".toLowerCase() === "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 587: should be = ", target); +} +if (!(("" + ("".toLowerCase() > "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 588: should be > ", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/tw-comparison-matrix-runtime.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-comparison-matrix-runtime.sb3.tw-snapshot index 46c13cfc851..5576caee39a 100644 --- a/test/snapshot/__snapshots__/tw-comparison-matrix-runtime.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-comparison-matrix-runtime.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 698b7a46d7ae7b0ea802888a6515a629f9a13721cae399629902031b0aa9c633 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 0", target); thread.procedures["Wrun test"](); @@ -14,10 +11,7 @@ retire(); return; }; }) // Sprite1 Wrun test -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["mfV;yS}9e:%h5UZ)QyiY"]; const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; const b2 = stage.variables["n^wm8jw#b24sggt.S^tD"]; @@ -27,22 +21,22 @@ return function funXYZ_run_test () { thread.procedures["Wsetup values"](); b0.value = 0; b1.value = 0; -for (var a0 = b2.value.length; a0 >= 0.5; a0--) { -b1.value = (toNotNaN(+b1.value) + 1); +for (var a0 = b2.value.length; a0 > 0; a0--) { +b1.value = (b1.value + 1); b3.value = 0; -for (var a1 = b2.value.length; a1 >= 0.5; a1--) { -b3.value = (toNotNaN(+b3.value) + 1); -b0.value = (toNotNaN(+b0.value) + 1); -if (!compareEqual(compareGreaterThan(listGet(b2.value, b1.value), (b2.value[(b3.value | 0) - 1] ?? "")), (b4.value[(b0.value | 0) - 1] ?? ""))) { -runtime.ext_scratch3_looks._say(("fail " + (("" + listGet(b2.value, b1.value)) + (" should be > " + ("" + listGet(b2.value, b3.value))))), target); +for (var a1 = b2.value.length; a1 > 0; a1--) { +b3.value = (b3.value + 1); +b0.value = (b0.value + 1); +if (!compareEqual(compareGreaterThan((b2.value[b1.value - 1] ?? ""), (b2.value[b3.value - 1] ?? "")), (b4.value[b0.value - 1] ?? ""))) { +runtime.ext_scratch3_looks._say(("fail " + (("" + (b2.value[b1.value - 1] ?? "")) + (" should be > " + ("" + (b2.value[b3.value - 1] ?? ""))))), target); } b0.value = (b0.value + 1); -if (!compareEqual(compareEqual(listGet(b2.value, b1.value), listGet(b2.value, b3.value)), (b4.value[(b0.value | 0) - 1] ?? ""))) { -runtime.ext_scratch3_looks._say(("fail " + (("" + listGet(b2.value, b1.value)) + (" should be = " + ("" + listGet(b2.value, b3.value))))), target); +if (!compareEqual(compareEqual((b2.value[b1.value - 1] ?? ""), (b2.value[b3.value - 1] ?? "")), (b4.value[b0.value - 1] ?? ""))) { +runtime.ext_scratch3_looks._say(("fail " + (("" + (b2.value[b1.value - 1] ?? "")) + (" should be = " + ("" + (b2.value[b3.value - 1] ?? ""))))), target); } b0.value = (b0.value + 1); -if (!compareEqual(compareLessThan(listGet(b2.value, b1.value), listGet(b2.value, b3.value)), (b4.value[(b0.value | 0) - 1] ?? ""))) { -runtime.ext_scratch3_looks._say(("fail " + (("" + listGet(b2.value, b1.value)) + (" should be < " + ("" + listGet(b2.value, b3.value))))), target); +if (!compareEqual(compareLessThan((b2.value[b1.value - 1] ?? ""), (b2.value[b3.value - 1] ?? "")), (b4.value[b0.value - 1] ?? ""))) { +runtime.ext_scratch3_looks._say(("fail " + (("" + (b2.value[b1.value - 1] ?? "")) + (" should be < " + ("" + (b2.value[b3.value - 1] ?? ""))))), target); } } } @@ -50,50 +44,84 @@ return ""; }; }) // Sprite1 Wsetup values -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["n^wm8jw#b24sggt.S^tD"]; return function funXYZ_setup_values () { b0.value = []; b0.value.push(0); +b0._monitorUpToDate = false; b0.value.push(1); +b0._monitorUpToDate = false; b0.value.push(2); +b0._monitorUpToDate = false; b0.value.push(-1); +b0._monitorUpToDate = false; b0.value.push(-2); +b0._monitorUpToDate = false; b0.value.push("0.0"); +b0._monitorUpToDate = false; b0.value.push("-0."); +b0._monitorUpToDate = false; b0.value.push("-0.0"); +b0._monitorUpToDate = false; b0.value.push(".123"); +b0._monitorUpToDate = false; b0.value.push("-.123"); +b0._monitorUpToDate = false; b0.value.push("1."); -b0.value.push(0); -b0.value.push(1); -b0.value.push(2); -b0.value.push(-1); -b0.value.push(-2); -b0.value.push(0.123); -b0.value.push(-0.123); -b0.value.push(1); +b0._monitorUpToDate = false; +b0.value.push((0 + 0)); +b0._monitorUpToDate = false; +b0.value.push((1 + 0)); +b0._monitorUpToDate = false; +b0.value.push((2 + 0)); +b0._monitorUpToDate = false; +b0.value.push((-1 + 0)); +b0._monitorUpToDate = false; +b0.value.push((-2 + 0)); +b0._monitorUpToDate = false; +b0.value.push((0.123 + 0)); +b0._monitorUpToDate = false; +b0.value.push((-0.123 + 0)); +b0._monitorUpToDate = false; +b0.value.push((1 + 0)); +b0._monitorUpToDate = false; b0.value.push("1e99"); -b0.value.push(1e+99); +b0._monitorUpToDate = false; +b0.value.push((1e+99 + 0)); +b0._monitorUpToDate = false; b0.value.push(Infinity); +b0._monitorUpToDate = false; b0.value.push(-Infinity); +b0._monitorUpToDate = false; b0.value.push("-infinitY"); -b0.value.push("Infinity"); -b0.value.push("-Infinity"); +b0._monitorUpToDate = false; +b0.value.push((1 / 0)); +b0._monitorUpToDate = false; +b0.value.push((-1 / 0)); +b0._monitorUpToDate = false; +b0.value.push((0 / 0)); +b0._monitorUpToDate = false; b0.value.push("NaN"); -b0.value.push(NaN); +b0._monitorUpToDate = false; b0.value.push("nan"); +b0._monitorUpToDate = false; b0.value.push("-NaN"); +b0._monitorUpToDate = false; b0.value.push("true"); +b0._monitorUpToDate = false; b0.value.push("false"); -b0.value.push(true); -b0.value.push(false); +b0._monitorUpToDate = false; +b0.value.push(!false); +b0._monitorUpToDate = false; +b0.value.push(!!false); +b0._monitorUpToDate = false; b0.value.push(""); +b0._monitorUpToDate = false; b0.value.push("Banana"); +b0._monitorUpToDate = false; b0.value.push(" "); +b0._monitorUpToDate = false; b0.value.push("🎉"); b0._monitorUpToDate = false; return ""; diff --git a/test/snapshot/__snapshots__/tw-compatibility-layer-type-barrier.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-compatibility-layer-type-barrier.sb3.tw-snapshot new file mode 100644 index 00000000000..66011d00da6 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-compatibility-layer-type-barrier.sb3.tw-snapshot @@ -0,0 +1,33 @@ +// TW Snapshot +// Input SHA-256: 7be6188a713254fa9b1f4ca207fbb6116aad958f321cd54f4f07f49a9f2c1a58 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = runtime.getOpcodeFunction("looks_sayforsecs"); +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +b0.value = (0 + 0); +yield* executeInCompatibilityLayer({"MESSAGE":"Hello!","SECS":0.1,}, b1, false, false, "d", null); +if (((toNotNaN(+b0.value) + 2) === 2)) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +thread.timer = timer(); +var a0 = Math.max(0, 1000 * 0); +runtime.requestRedraw(); +yield; +while (thread.timer.timeElapsed() < a0) { +yield; +} +thread.timer = null; +b0.value = "string"; +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/tw-coordinate-precision.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-coordinate-precision.sb3.tw-snapshot index 3165ebb9fd7..446c232e2d2 100644 --- a/test/snapshot/__snapshots__/tw-coordinate-precision.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-coordinate-precision.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: b1e62179f7a495c46c7e9c64a03d405924f6011b66aa71f6ec0f1781b936d38c // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = runtime.getSpriteTargetByName("Sprite1"); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 6", target); @@ -22,7 +19,7 @@ target.setXY(target.x + -9e-10, target.y); if (((b0 ? b0.x : 0) === 1.0000000000000007e-10)) { runtime.ext_scratch3_looks._say("pass 'of' never rounds - positive x", target); } -if (compareEqual(limitPrecision(target.x), 0)) { +if ((limitPrecision(target.x) === 0)) { runtime.ext_scratch3_looks._say("pass x slightly above 0 rounds", target); } target.setXY(target.x + -9e-10, target.y); @@ -30,7 +27,7 @@ target.setXY(target.x, target.y + 0); if (((b0 ? b0.x : 0) === -7.999999999999999e-10)) { runtime.ext_scratch3_looks._say("pass 'of' never rounds and change x - negative x", target); } -if (compareEqual(limitPrecision(target.x), 0)) { +if ((limitPrecision(target.x) === 0)) { runtime.ext_scratch3_looks._say("pass x slightly below 0 rounds", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/tw-counter.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-counter.sb3.tw-snapshot index 7814ceddea4..838b27fe8f0 100644 --- a/test/snapshot/__snapshots__/tw-counter.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-counter.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 29dd30c632645f071bfd450530dab86dc85a2c1cf30564bee984394a790eca6a // 2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { if ((runtime.ext_scratch3_control._counter === 10)) { runtime.ext_scratch3_looks._say("pass global", target); @@ -15,13 +12,10 @@ retire(); return; }; }) // 1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 5", target); -if (compareEqual(runtime.ext_scratch3_control._counter, 0)) { +if ((runtime.ext_scratch3_control._counter === 0)) { runtime.ext_scratch3_looks._say("pass initial value = 0", target); } runtime.ext_scratch3_control._counter++; @@ -33,7 +27,7 @@ if ((runtime.ext_scratch3_control._counter === 2)) { runtime.ext_scratch3_looks._say("pass incr 2", target); } runtime.ext_scratch3_control._counter = 0; -if (compareEqual(runtime.ext_scratch3_control._counter, 0)) { +if ((runtime.ext_scratch3_control._counter === 0)) { runtime.ext_scratch3_looks._say("pass clear = 0", target); } for (var a0 = 10; a0 > 0; a0--) { diff --git a/test/snapshot/__snapshots__/tw-custom-report-repeat.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-custom-report-repeat.sb3.tw-snapshot index 7a823128c3a..d6422034fe0 100644 --- a/test/snapshot/__snapshots__/tw-custom-report-repeat.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-custom-report-repeat.sb3.tw-snapshot @@ -2,15 +2,12 @@ // Input SHA-256: d293b52c4330db5d33eddb66742496017b5c96baacc41654961cfa97d08668d8 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); b0.value = 0; -for (var a0 = 40; a0 > 0; a0--) { +for (var a0 = toNotNaN(+thread.procedures["Zblock name"]()); a0 >= 0.5; a0--) { b0.value = (toNotNaN(+b0.value) + 1); yield; } @@ -22,10 +19,7 @@ retire(); return; }; }) // Sprite1 Zblock name -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_block_name () { return 40; return ""; diff --git a/test/snapshot/__snapshots__/tw-equals-switch.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-equals-switch.sb3.tw-snapshot index e8075a9abd1..8135332193c 100644 --- a/test/snapshot/__snapshots__/tw-equals-switch.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-equals-switch.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 55ae20c1bc8ad00aa7aa1ae5c85ce475c797652408507387fbbc6788a58a48fa // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); yield* waitThreads(startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "t1" })); @@ -15,46 +12,36 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["switchsubj-id"]; const b1 = stage.variables["switchlist-id"]; return function* genXYZ () { -b0.value = (b1.value[0] ?? ""); -switch ((("" + b0.value)).toLowerCase()) { -case "hello": { +b0.value = (b1.value[1 - 1] ?? ""); +if ((("" + b0.value).toLowerCase() === "hello".toLowerCase())) { runtime.ext_scratch3_looks._say("pass string", target); retire(); return; -break; } -case "world": { +} +if ((("" + b0.value).toLowerCase() === "world".toLowerCase())) { runtime.ext_scratch3_looks._say("fail string-wrong-branch", target); retire(); return; -break; } } runtime.ext_scratch3_looks._say("fail string-no-match", target); retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["switchsubj-id"]; const b1 = stage.variables["switchlist-id"]; return function* genXYZ () { -b0.value = (b1.value[1] ?? ""); -switch (toSwitchNumber(b0.value)) { -case 0: { +b0.value = (b1.value[2 - 1] ?? ""); +if (compareEqual(b0.value, 0)) { runtime.ext_scratch3_looks._say("fail numeric-matched-0", target); retire(); return; -break; } -case 1: { +} +if ((toNotNaN(+b0.value) === 1)) { runtime.ext_scratch3_looks._say("fail numeric-matched-1", target); retire(); return; -break; } } runtime.ext_scratch3_looks._say("pass numeric", target); retire(); return; diff --git a/test/snapshot/__snapshots__/tw-exit-state-accounts-for-yields-in-procedures.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-exit-state-accounts-for-yields-in-procedures.sb3.tw-snapshot new file mode 100644 index 00000000000..14cf2f1aa3b --- /dev/null +++ b/test/snapshot/__snapshots__/tw-exit-state-accounts-for-yields-in-procedures.sb3.tw-snapshot @@ -0,0 +1,37 @@ +// TW Snapshot +// Input SHA-256: 4715c75fe8effcdcdea3ad810949e33a7b6beb3fbd253c1edc2ed4f2bd093df3 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = stage.variables["FpLI$ida6)qR,q~y`1|*"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +b0.value = (1 + 2); +yield* thread.procedures["Zsomething that yields"](); +if ((("" + listGet(b1.value, b0.value)).toLowerCase() === "the only thing".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Zsomething that yields +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +return function* genXYZ_something_that_yield () { +for (var a0 = 2; a0 > 0; a0--) { +yield; +} +return ""; +}; }) + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +for (var a0 = 1; a0 > 0; a0--) { +yield; +} +b0.value = "random"; +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/tw-forkphorus-515-boolean-number-comparison.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-forkphorus-515-boolean-number-comparison.sb3.tw-snapshot index 33d11f96163..754e542daa6 100644 --- a/test/snapshot/__snapshots__/tw-forkphorus-515-boolean-number-comparison.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-forkphorus-515-boolean-number-comparison.sb3.tw-snapshot @@ -2,16 +2,21 @@ // Input SHA-256: fd48053df5e75de0ec56ac106699076335b2bd46266f8da4e4d81d52e29f5c29 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 4", target); +if (compareGreaterThan(("something".toLowerCase() === "something".toLowerCase()), ("0" + ""))) { runtime.ext_scratch3_looks._say("pass", target); +} +if (compareLessThan(("something".toLowerCase() === "else".toLowerCase()), ("1" + ""))) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((+("something".toLowerCase() === "something".toLowerCase())) > (0 + 0))) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((+("something".toLowerCase() === "else".toLowerCase())) < (1 + 0))) { runtime.ext_scratch3_looks._say("pass", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/tw-forkphorus-515-non-finite-direction.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-forkphorus-515-non-finite-direction.sb3.tw-snapshot index 7207071a203..f6f6db0a82b 100644 --- a/test/snapshot/__snapshots__/tw-forkphorus-515-non-finite-direction.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-forkphorus-515-non-finite-direction.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 1fa5a314682ce218a097be41607e4eb456a2b046a47ca46d01a1033323afa544 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = runtime.getOpcodeFunction("motion_pointtowards"); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 4", target); @@ -13,12 +10,12 @@ target.setDirection(95); if ((target.direction === 95)) { runtime.ext_scratch3_looks._say("pass 1", target); } -target.setDirection(Infinity); +target.setDirection((1 / 0)); if ((target.direction === 95)) { runtime.ext_scratch3_looks._say("pass 2", target); } -target.setDirection(0); -if (compareEqual(target.direction, 0)) { +target.setDirection(toNotNaN((0 / 0))); +if ((target.direction === 0)) { runtime.ext_scratch3_looks._say("pass 3", target); } yield* executeInCompatibilityLayer({"TOWARDS":"Sprite2",}, b0, false, false, "g", null); diff --git a/test/snapshot/__snapshots__/tw-forkphorus-515-random-with-invalid-number-with-period.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-forkphorus-515-random-with-invalid-number-with-period.sb3.tw-snapshot index b895f028d4d..4fcfeee75e0 100644 --- a/test/snapshot/__snapshots__/tw-forkphorus-515-random-with-invalid-number-with-period.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-forkphorus-515-random-with-invalid-number-with-period.sb3.tw-snapshot @@ -2,31 +2,28 @@ // Input SHA-256: 725e0683c8cd39c78a143727bf26f8827d1e9fd627eef68a772d8a3a06806c65 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 6", target); -b0.value = runtime.ext_scratch3_operators._random("an invalid number.", 1); -if (compareGreaterThan(b0.value, 0)) { +b0.value = runtime.ext_scratch3_operators._random(("an invalid number" + "."), 1); +if (!(b0.value <= 0)) { runtime.ext_scratch3_looks._say("pass", target); } -if (compareLessThan(b0.value, 1)) { +if ((b0.value < 1)) { runtime.ext_scratch3_looks._say("pass", target); } -if ((("" + b0.value).toLowerCase().indexOf(".") !== -1)) { +if ((("" + b0.value).toLowerCase().indexOf(".".toLowerCase()) !== -1)) { runtime.ext_scratch3_looks._say("pass", target); } -b0.value = runtime.ext_scratch3_operators._random(1, "an invalid number."); -if (compareGreaterThan(b0.value, 0)) { +b0.value = runtime.ext_scratch3_operators._random(1, ("an invalid number" + ".")); +if (!(b0.value <= 0)) { runtime.ext_scratch3_looks._say("pass", target); } -if (compareLessThan(b0.value, 1)) { +if ((b0.value < 1)) { runtime.ext_scratch3_looks._say("pass", target); } -if ((("" + b0.value).toLowerCase().indexOf(".") !== -1)) { +if ((("" + b0.value).toLowerCase().indexOf(".".toLowerCase()) !== -1)) { runtime.ext_scratch3_looks._say("pass", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/tw-forkphorus-515-variable-id-name-desync-name-fallback.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-forkphorus-515-variable-id-name-desync-name-fallback.sb3.tw-snapshot index c1a95c0742b..5b92a63c221 100644 --- a/test/snapshot/__snapshots__/tw-forkphorus-515-variable-id-name-desync-name-fallback.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-forkphorus-515-variable-id-name-desync-name-fallback.sb3.tw-snapshot @@ -2,24 +2,21 @@ // Input SHA-256: 1d02d01ddcd53c67e093bda79912f19683829f86fd23e1f77cbfc0aef03dc0f3 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = target.variables["gTtSj;o_E;Snkn620KF."]; const b1 = target.variables["zShM`!CD?d_|Z,]5X}N6"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); b0.value = 2; -if ((toNotNaN(+b0.value) === 2)) { +if ((b0.value === 2)) { runtime.ext_scratch3_looks._say("pass variable", target); } b1.value = []; b1.value.push(3); -if ((toNotNaN(+(b1.value[0] ?? "")) === 3)) { +b1._monitorUpToDate = false; +if ((toNotNaN(+(b1.value[1 - 1] ?? "")) === 3)) { runtime.ext_scratch3_looks._say("pass list", target); } runtime.ext_scratch3_looks._say("end", target); -b1._monitorUpToDate = false; retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/tw-forkphorus-515-wait-zero-seconds-in-warp-mode.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-forkphorus-515-wait-zero-seconds-in-warp-mode.sb3.tw-snapshot index 08b03cc655a..c2537995306 100644 --- a/test/snapshot/__snapshots__/tw-forkphorus-515-wait-zero-seconds-in-warp-mode.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-forkphorus-515-wait-zero-seconds-in-warp-mode.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: a8576b7695ad77f7d5a7ac9fb76d31f026c0869f16f55d16fa40b85972b43e30 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = runtime.getOpcodeFunction("sound_setvolumeto"); const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { @@ -24,17 +21,13 @@ retire(); return; }; }) // Sprite1 Wno refresh -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = runtime.getOpcodeFunction("music_restForBeats"); const b1 = runtime.getOpcodeFunction("music_playDrumForBeats"); return function* genXYZ_no_refresh () { for (var a0 = 30; a0 > 0; a0--) { thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); while (thread.timer.timeElapsed() < a1) { if (isStuck()) yield; @@ -48,27 +41,20 @@ return ""; }; }) // Sprite1 Wruns below with no refresh -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ_runs_below_with_no_r () { yield* thread.procedures["Whas refresh"](); return ""; }; }) // Sprite1 Whas refresh -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = runtime.getOpcodeFunction("music_restForBeats"); const b1 = runtime.getOpcodeFunction("music_playDrumForBeats"); return function* genXYZ_has_refresh () { for (var a0 = 30; a0 > 0; a0--) { thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); while (thread.timer.timeElapsed() < a1) { if (isStuck()) yield; @@ -82,10 +68,7 @@ return ""; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { while (true) { diff --git a/test/snapshot/__snapshots__/tw-gh-201-stop-script-does-not-reevaluate-arguments.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-gh-201-stop-script-does-not-reevaluate-arguments.sb3.tw-snapshot index ee6830411fc..9bb8aee3462 100644 --- a/test/snapshot/__snapshots__/tw-gh-201-stop-script-does-not-reevaluate-arguments.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-gh-201-stop-script-does-not-reevaluate-arguments.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: fd981742e0e4299bad5a89349635d3a7d0467d8163ae77ba4bafe43c97849bae // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 0", target); thread.procedures["Zfoo %s"](""); @@ -14,20 +11,14 @@ retire(); return; }; }) // Sprite1 Zfoo %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_foo_ (p0) { return ""; return ""; }; }) // Sprite1 Zno op -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_no_op () { return ""; }; }) diff --git a/test/snapshot/__snapshots__/tw-gh-249-quicksort.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-gh-249-quicksort.sb3.tw-snapshot new file mode 100644 index 00000000000..f300be90657 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-gh-249-quicksort.sb3.tw-snapshot @@ -0,0 +1,110 @@ +// TW Snapshot +// Input SHA-256: ce657aa0f3e55d0c2166813c9fa3dd076c3f0c81df2e527f44d0ad31856a448d + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +thread.procedures["Wrun"](); +thread.procedures["Wvalidate"](); +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Wrun +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["EF^k=u-t@S)w60;RP?dZ-list-list"]; +const b1 = stage.variables["rQq!wAuU2T9DV9,S[/s."]; +return function funXYZ_run () { +b0.value = []; +for (var a0 = 100; a0 > 0; a0--) { +b0.value.push((b1.value[(b0.value.length + 1) - 1] ?? "")); +b0._monitorUpToDate = false; +} +thread.procedures["Wqsort %s %s"](1,b0.value.length); +return ""; +}; }) + +// Sprite1 Wvalidate +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["7AH{dO^X;}C[{[l~g-7m"]; +const b1 = stage.variables["gPJ}c-PZz?Y+_L][iMU_"]; +const b2 = stage.variables["EF^k=u-t@S)w60;RP?dZ-list-list"]; +const b3 = stage.variables["FsKqV/2kid0gw0J+Jj(c"]; +return function funXYZ_validate () { +b0.value = 1; +b1.value = 1; +for (var a0 = b2.value.length; a0 > 0; a0--) { +if (!compareEqual((b2.value[b1.value - 1] ?? ""), (b3.value[b1.value - 1] ?? ""))) { +b0.value = 0; +runtime.ext_scratch3_looks._say(("fail mismatch at index " + ("" + b1.value)), target); +} +b1.value = (b1.value + 1); +} +if ((b0.value === 1)) { +runtime.ext_scratch3_looks._say("pass sorted", target); +} +return ""; +}; }) + +// Sprite1 Wqsort %s %s +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["EF^k=u-t@S)w60;RP?dZ-pivot-"]; +const b1 = stage.variables["EF^k=u-t@S)w60;RP?dZ-list-list"]; +const b2 = stage.variables["EF^k=u-t@S)w60;RP?dZ-low-"]; +const b3 = stage.variables["EF^k=u-t@S)w60;RP?dZ-high-"]; +const b4 = stage.variables["EF^k=u-t@S)w60;RP?dZ-tmp-"]; +const b5 = target.variables["JIHtr29*ug5G;5*`f2.K-i-"]; +const b6 = target.variables["JIHtr29*ug5G;5*`f2.K-min pos-"]; +const b7 = target.variables["JIHtr29*ug5G;5*`f2.K-min-"]; +const b8 = target.variables["JIHtr29*ug5G;5*`f2.K-j-"]; +return function funXYZ_qsort__ (p0,p1) { +if (compareLessThan(p0, p1)) { +if (!((toNotNaN(+p1) - toNotNaN(+p0)) <= 7)) { +b0.value = (b1.value[((toNotNaN((toNotNaN(+p1) + toNotNaN(+p0))) / 2) | 0) - 1] ?? ""); +b2.value = p0; +b3.value = p1; +while (true) { +while (compareLessThan(listGet(b1.value, b2.value), b0.value)) { +b2.value = (toNotNaN(+b2.value) + 1); +} +while (compareGreaterThan(listGet(b1.value, b3.value), b0.value)) { +b3.value = (toNotNaN(+b3.value) + -1); +} +if (compareGreaterThan(b2.value, b3.value)) { +thread.procedures["Wqsort %s %s"](p0,b3.value); +thread.procedures["Wqsort %s %s"](b2.value,p1); +return ""; +} else { +b4.value = listGet(b1.value, b2.value); +listReplace(b1, b2.value, listGet(b1.value, b3.value)); +listReplace(b1, b3.value, b4.value); +b2.value = (toNotNaN(+b2.value) + 1); +b3.value = (toNotNaN(+b3.value) + -1); +} +} +} else { +b5.value = p0; +for (var a0 = toNotNaN((toNotNaN(+p1) - toNotNaN(+p0))); a0 >= 0.5; a0--) { +b6.value = b5.value; +b7.value = listGet(b1.value, b5.value); +b8.value = (toNotNaN(+b5.value) + 1); +for (var a1 = toNotNaN((toNotNaN(+p1) - toNotNaN(+b5.value))); a1 >= 0.5; a1--) { +if (compareLessThan((b1.value[(b8.value | 0) - 1] ?? ""), b7.value)) { +b7.value = (b1.value[(b8.value | 0) - 1] ?? ""); +b6.value = b8.value; +} +b8.value = (b8.value + 1); +} +if (compareEqual(b6.value, b5.value)) { +} else { +b4.value = listGet(b1.value, b5.value); +listReplace(b1, b5.value, b7.value); +listReplace(b1, b6.value, b4.value); +} +b5.value = (toNotNaN(+b5.value) + 1); +} +} +} +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/tw-letter-of-case.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-letter-of-case.sb3.tw-snapshot index a4a084349bc..aa37a6e0598 100644 --- a/test/snapshot/__snapshots__/tw-letter-of-case.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-letter-of-case.sb3.tw-snapshot @@ -2,16 +2,13 @@ // Input SHA-256: da467c1780e50ee05d590848c641a3e076d98ec69a957a10cf125f1f0a739400 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { -runtime.ext_scratch3_looks._say("H", target); -runtime.ext_scratch3_looks._say("A", target); -runtime.ext_scratch3_looks._say("C", target); -runtime.ext_scratch3_looks._say("E", target); -runtime.ext_scratch3_looks._say("o", target); +runtime.ext_scratch3_looks._say((("Hello")[1 - 1] || ""), target); +runtime.ext_scratch3_looks._say((("ABC")[1 - 1] || ""), target); +runtime.ext_scratch3_looks._say((("ABC")[3 - 1] || ""), target); +runtime.ext_scratch3_looks._say((("MixEd")[4 - 1] || ""), target); +runtime.ext_scratch3_looks._say((("Hello")[5 - 1] || ""), target); runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/tw-list-any.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-list-any.sb3.tw-snapshot index d3a69cf84ab..e099222961b 100644 --- a/test/snapshot/__snapshots__/tw-list-any.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-list-any.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: a4ae71d2c1b70f29a667c2d582b24702068f1d128512b7aee53b2feddd274527 // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["eFlmP1{XC+I1:h0Yln.K"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 7", target); @@ -32,7 +29,7 @@ listDelete(b0, "any"); if ((b0.value.length === 2)) { runtime.ext_scratch3_looks._say("pass", target); } -if (compareEqual(listGet(b0.value, "*"), "")) { +if ((("" + listGet(b0.value, "*")).toLowerCase() === "".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/tw-loop-condition-optimization-gh-276.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-loop-condition-optimization-gh-276.sb3.tw-snapshot new file mode 100644 index 00000000000..5cc654ba081 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-loop-condition-optimization-gh-276.sb3.tw-snapshot @@ -0,0 +1,27 @@ +// TW Snapshot +// Input SHA-256: 3c81a01417b9a927457132a5f89b63e54b2499714376246739535b51dbce2d45 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +thread.procedures["Wtest %s"]("random"); +if ((("" + b0.value).toLowerCase() === "random".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Wtest %s +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = stage.variables["t)]?yi[*8XU73qhMqOa8"]; +return function funXYZ_test_ (p0) { +b0.value = p0; +while (!(("" + listGet(b1.value, b0.value)).toLowerCase() === "something".toLowerCase())) { +b0.value = (toNotNaN(+b0.value) + 1); +} +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/tw-native-switch.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-native-switch.sb3.tw-snapshot index 2ed9f9f0de9..2c8635d291a 100644 --- a/test/snapshot/__snapshots__/tw-native-switch.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-native-switch.sb3.tw-snapshot @@ -2,14 +2,11 @@ // Input SHA-256: cb45d7d2caeedd6bfe00857c96f32600d3d9b7d8a64de88ca67eb4b30319f67c // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["sl-id"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 3", target); -switch (("" + (b0.value[0] ?? ""))) { +switch (("" + (b0.value[1 - 1] ?? ""))) { case "hello": { runtime.ext_scratch3_looks._say("fail-wrong-case", target); break; @@ -25,7 +22,7 @@ break; } default: runtime.ext_scratch3_looks._say("fail-default", target); } -switch (("" + (b0.value[1] ?? ""))) { +switch (("" + (b0.value[2 - 1] ?? ""))) { case "0": { runtime.ext_scratch3_looks._say("fail", target); break; @@ -41,7 +38,7 @@ break; } default: runtime.ext_scratch3_looks._say("pass s1-default", target); } -switch (("" + (b0.value[2] ?? ""))) { +switch (("" + (b0.value[3 - 1] ?? ""))) { case "1": { runtime.ext_scratch3_looks._say("fail", target); break; diff --git a/test/snapshot/__snapshots__/tw-non-warp-loop-condition-analysis.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-non-warp-loop-condition-analysis.sb3.tw-snapshot new file mode 100644 index 00000000000..6dda54881f6 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-non-warp-loop-condition-analysis.sb3.tw-snapshot @@ -0,0 +1,28 @@ +// TW Snapshot +// Input SHA-256: be149d21cc69628647000cc698ebd60949252730a0ea7b19f71cc85fe927b294 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["%ehs:~!Y0l-5=!mnd-B?"]; +const b1 = stage.variables["=3aHfv[mKa)v,Wfpy:y?"]; +const b2 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +b0.value = []; +b0.value.push((1 + 2)); +b0._monitorUpToDate = false; +b0.value.push("eof"); +b0._monitorUpToDate = false; +b1.value = 0; +b2.value = "bwah"; +while (!(("" + b2.value).toLowerCase() === "eof".toLowerCase())) { +b1.value = (toNotNaN(+b1.value) + 1); +b2.value = (b0.value[(b1.value | 0) - 1] ?? ""); +yield; +} +if ((toNotNaN(+b1.value) === 2)) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/tw-obsolete-blocks.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-obsolete-blocks.sb3.tw-snapshot index 9bd7bd5c8ef..71a44853beb 100644 --- a/test/snapshot/__snapshots__/tw-obsolete-blocks.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-obsolete-blocks.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 58dd6f369897907ea46fffbb8210d8bc15db59f26ce117ff4211035afff17f23 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; const b1 = runtime.getOpcodeFunction("sensing_userid"); const b2 = runtime.getOpcodeFunction("motion_xscroll"); diff --git a/test/snapshot/__snapshots__/tw-one-divide-negative-zero.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-one-divide-negative-zero.sb3.tw-snapshot index 991e796953c..3e2eeffa931 100644 --- a/test/snapshot/__snapshots__/tw-one-divide-negative-zero.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-one-divide-negative-zero.sb3.tw-snapshot @@ -2,13 +2,12 @@ // Input SHA-256: 169af11f112ebea3d6768317652a72a6374c407f432537990689d46080fe2b92 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); +if (((1 / -0) === -Infinity)) { runtime.ext_scratch3_looks._say("pass", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/tw-preciseProjectTimer-drift-453118719.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-preciseProjectTimer-drift-453118719.sb3.tw-snapshot index 0b34b8a4f23..3b2521664aa 100644 --- a/test/snapshot/__snapshots__/tw-preciseProjectTimer-drift-453118719.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-preciseProjectTimer-drift-453118719.sb3.tw-snapshot @@ -2,11 +2,7 @@ // Input SHA-256: 19e0b3f9dcac763041039a8ffe87b6732eb744f9ebb136e8d61a53ccf19118e3 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["PsY$$vp$IVH;dDAr[q2h"]; const b1 = stage.variables["l^q!%fq]Bv;72dlGf}^Z"]; return function* genXYZ () { @@ -15,7 +11,7 @@ runtime.ext_scratch3_looks._say("plan 0", target); for (var a0 = 30; a0 > 0; a0--) { b1.value = runtime.ioDevices.clock.projectTimer(); thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a1) { @@ -30,10 +26,7 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["l^q!%fq]Bv;72dlGf}^Z"]; const b1 = runtime.getOpcodeFunction("event_whengreaterthan"); const b2 = stage.variables["PsY$$vp$IVH;dDAr[q2h"]; diff --git a/test/snapshot/__snapshots__/tw-prefers-first-occurence-of-procedure-387608267.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-prefers-first-occurence-of-procedure-387608267.sb3.tw-snapshot index f975174e6e0..adf5671a8c7 100644 --- a/test/snapshot/__snapshots__/tw-prefers-first-occurence-of-procedure-387608267.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-prefers-first-occurence-of-procedure-387608267.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 5b964fa791468016b188af74e50cadad73d482be066b104bb22faff7e4a156dc // Player script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); thread.procedures["ZSet Costume"](); @@ -14,10 +11,7 @@ retire(); return; }; }) // Player ZSet Costume -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_Set_Costume () { runtime.ext_scratch3_looks._say("pass", target); return ""; diff --git a/test/snapshot/__snapshots__/tw-procedure-arguments-with-same-name.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-procedure-arguments-with-same-name.sb3.tw-snapshot index d1e2d9c353f..5766bd76809 100644 --- a/test/snapshot/__snapshots__/tw-procedure-arguments-with-same-name.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-procedure-arguments-with-same-name.sb3.tw-snapshot @@ -2,35 +2,26 @@ // Input SHA-256: a340f37844807c66f3b85eb4e85c8092a779d33d50e5655e035420ae05cea26c // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); thread.procedures["Znumber or text %s %s"]("bad","ok"); -thread.procedures["Zboolean %b %b"]("false",true); +thread.procedures["Zboolean %b %b"]("false",!false); runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) // Sprite1 Znumber or text %s %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_number_or_text__ (p0,p1) { -if ((("" + p1).toLowerCase() === "ok")) { +if ((("" + p1).toLowerCase() === "ok".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } return ""; }; }) // Sprite1 Zboolean %b %b -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_boolean__ (p0,p1) { if (toBoolean(p1)) { runtime.ext_scratch3_looks._say("pass", target); diff --git a/test/snapshot/__snapshots__/tw-procedure-call-resets-variable-input-types-430811055.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-procedure-call-resets-variable-input-types-430811055.sb3.tw-snapshot index f1ee6475cd1..98305cc14c7 100644 --- a/test/snapshot/__snapshots__/tw-procedure-call-resets-variable-input-types-430811055.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-procedure-call-resets-variable-input-types-430811055.sb3.tw-snapshot @@ -2,16 +2,13 @@ // Input SHA-256: 2afbb43dad9e66e37997e13bf3ffb90bf39effd8974c2eb1a95bed61d437b6de // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); b0.value = ""; -b0.value = "help"; -if (!compareEqual(b0.value, "")) { +thread.procedures["Zdo something"](); +if (!(b0.value.toLowerCase() === "".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } runtime.ext_scratch3_looks._say("end", target); @@ -19,10 +16,7 @@ retire(); return; }; }) // Sprite1 Zdo something -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function funXYZ_do_something () { b0.value = "help"; diff --git a/test/snapshot/__snapshots__/tw-procedure-prototype-exists-but-not-definition-549160843.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-procedure-prototype-exists-but-not-definition-549160843.sb3.tw-snapshot index e50a1487b34..e0e3857ecd3 100644 --- a/test/snapshot/__snapshots__/tw-procedure-prototype-exists-but-not-definition-549160843.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-procedure-prototype-exists-but-not-definition-549160843.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 9805621c896afb4a8ed71236417a0311e5f4f38378214914625248b6157178b4 // Apple script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 0", target); runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/tw-procedure-return-non-existant.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-procedure-return-non-existant.sb3.tw-snapshot index c667e699f94..2cf755d294c 100644 --- a/test/snapshot/__snapshots__/tw-procedure-return-non-existant.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-procedure-return-non-existant.sb3.tw-snapshot @@ -2,18 +2,14 @@ // Input SHA-256: b9110339d39947f68168cbb129a20b23b7d4e607ffd5624bd67e096451f6a329 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ () { b0.value = 0; while (true) { b0.value = (toNotNaN(+b0.value) + 1); thread.timer = timer(); -var a0 = max(0, 1000 * -1); +var a0 = Math.max(0, 1000 * -1); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -26,36 +22,31 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); b0.value = 0; +if (compareEqual(thread.procedures["Zinvalid params - reporter"](), 0)) { runtime.ext_scratch3_looks._say("pass invalid params reporter", target); +} +if (compareEqual(thread.procedures["Zinvalid params - boolean"](), 0)) { runtime.ext_scratch3_looks._say("pass invalid params boolean", target); +} runtime.stopForTarget(target, thread); runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) // Sprite1 Zinvalid params - reporter -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_invalid_params___rep () { return 0; return ""; }; }) // Sprite1 Zinvalid params - boolean -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_invalid_params___boo () { return 0; return ""; diff --git a/test/snapshot/__snapshots__/tw-procedure-return-non-existent.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-procedure-return-non-existent.sb3.tw-snapshot index db382d3bb01..7c867947149 100644 --- a/test/snapshot/__snapshots__/tw-procedure-return-non-existent.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-procedure-return-non-existent.sb3.tw-snapshot @@ -2,16 +2,13 @@ // Input SHA-256: 2d07ab31e7f1e6f263996fa42ff79f849fed048a047d68960bd324960bcc1452 // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); b0.value = "discard me"; b0.value = ""; -if (compareEqual(b0.value, "")) { +if ((("" + b0.value).toLowerCase() === "".toLowerCase())) { runtime.ext_scratch3_looks._say("pass non existent procedure returned empty string", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/tw-procedure-return-recursion.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-procedure-return-recursion.sb3.tw-snapshot index 879dc13362b..d0e29b100c2 100644 --- a/test/snapshot/__snapshots__/tw-procedure-return-recursion.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-procedure-return-recursion.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: b1802636bbbd479dcf8634a525798c5b4dd9b0201cf6af6f5b4879455368c328 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { @@ -17,7 +14,7 @@ runtime.ext_scratch3_looks._say("pass non warp recursion yields", target); } b0.value = 0; b1.value = thread.procedures["Wwarp recursion should not yield %s"](8); -if (compareEqual(b0.value, 0)) { +if ((b0.value === 0)) { runtime.ext_scratch3_looks._say("pass warp recursion does not yield", target); } b0.value = 0; @@ -33,10 +30,7 @@ retire(); return; }; }) // Sprite1 Znon warp recursion should yield %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ_non_warp_recursion_s (p0) { if (compareGreaterThan(p0, 0)) { return (yield* yieldThenCallGenerator(thread.procedures["Znon warp recursion should yield %s"], (toNotNaN(+p0) - 1))); @@ -45,10 +39,7 @@ return ""; }; }) // Sprite1 Wwarp recursion should not yield %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_warp_recursion_shoul (p0) { if (compareGreaterThan(p0, 0)) { return thread.procedures["Wwarp recursion should not yield %s"]((toNotNaN(+p0) - 1)); @@ -57,10 +48,7 @@ return ""; }; }) // Sprite1 Zfib %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ_fib_ (p0) { if (compareLessThan(p0, 2)) { return p0; @@ -71,14 +59,11 @@ return ""; }; }) // Sprite1 Zrecursing yields between each %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ_recursing_yields_bet (p0) { -if ((("" + p0).toLowerCase() === "initial")) { +if ((("" + p0).toLowerCase() === "initial".toLowerCase())) { b0.value = 0; b1.value = (toNotNaN(+(yield* yieldThenCallGenerator(thread.procedures["Zrecursing yields between each %s"], 1))) + toNotNaN((toNotNaN(+(yield* yieldThenCallGenerator(thread.procedures["Zrecursing yields between each %s"], 1))) + toNotNaN((toNotNaN(+(yield* yieldThenCallGenerator(thread.procedures["Zrecursing yields between each %s"], 2))) + toNotNaN((toNotNaN(+(yield* yieldThenCallGenerator(thread.procedures["Zrecursing yields between each %s"], 2))) + toNotNaN((toNotNaN(+(yield* yieldThenCallGenerator(thread.procedures["Zrecursing yields between each %s"], 3))) + toNotNaN(+(yield* yieldThenCallGenerator(thread.procedures["Zrecursing yields between each %s"], 3)))))))))))); if ((toNotNaN(+b0.value) === 3)) { @@ -97,37 +82,34 @@ return ""; }; }) // Sprite1 Zrecursing arguments eval order %s %s %s %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["4HH82mPlVMOONdl(Ot*7"]; const b1 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; const b2 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ_recursing_arguments_ (p0,p1,p2,p3) { -if ((("" + p0).toLowerCase() === "initial")) { +if ((("" + p0).toLowerCase() === "initial".toLowerCase())) { b0.value = []; b1.value = 0; b2.value = (yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 1",(yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 2",(yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 3",(yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 4","","","")),(yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 5","","","")),(yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 6","","","")))),"","")),"",(yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 7","","","")))); -if ((("" + (b0.value[0] ?? "")).toLowerCase() === "1/child 4")) { +if ((("" + (b0.value[1 - 1] ?? "")).toLowerCase() === "1/child 4".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 1", target); } -if ((("" + (b0.value[1] ?? "")).toLowerCase() === "1/child 5")) { +if ((("" + (b0.value[2 - 1] ?? "")).toLowerCase() === "1/child 5".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 2", target); } -if ((("" + (b0.value[2] ?? "")).toLowerCase() === "2/child 6")) { +if ((("" + (b0.value[3 - 1] ?? "")).toLowerCase() === "2/child 6".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 3", target); } -if ((("" + (b0.value[3] ?? "")).toLowerCase() === "2/child 3")) { +if ((("" + (b0.value[4 - 1] ?? "")).toLowerCase() === "2/child 3".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 4", target); } -if ((("" + (b0.value[4] ?? "")).toLowerCase() === "3/child 2")) { +if ((("" + (b0.value[5 - 1] ?? "")).toLowerCase() === "3/child 2".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 5", target); } -if ((("" + (b0.value[5] ?? "")).toLowerCase() === "3/child 7")) { +if ((("" + (b0.value[6 - 1] ?? "")).toLowerCase() === "3/child 7".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 6", target); } -if ((("" + (b0.value[6] ?? "")).toLowerCase() === "4/child 1")) { +if ((("" + (b0.value[7 - 1] ?? "")).toLowerCase() === "4/child 1".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 7", target); } if ((b0.value.length === 7)) { @@ -135,24 +117,20 @@ runtime.ext_scratch3_looks._say("pass recurse arg order - length is correct", ta } } else { b0.value.push((("" + b1.value) + ("/" + ("" + p0)))); -} b0._monitorUpToDate = false; +} return ""; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ () { b0.value = 0; while (true) { b0.value = (toNotNaN(+b0.value) + 1); thread.timer = timer(); -var a0 = max(0, 1000 * -1); +var a0 = Math.max(0, 1000 * -1); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { diff --git a/test/snapshot/__snapshots__/tw-procedure-return-simple.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-procedure-return-simple.sb3.tw-snapshot index 8c6d150f431..c14aa78f900 100644 --- a/test/snapshot/__snapshots__/tw-procedure-return-simple.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-procedure-return-simple.sb3.tw-snapshot @@ -2,15 +2,14 @@ // Input SHA-256: cd516553f3cbf4a41ae9a8bc1f5d06a3392d365226bccdfa294578314f18facb // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 8", target); +if ((("" + thread.procedures["Zsimplest"]()).toLowerCase() === "It works!".toLowerCase())) { runtime.ext_scratch3_looks._say("pass simplest", target); -if ((("" + thread.procedures["Znesting 1"]()).toLowerCase() === "42-54")) { +} +if ((("" + thread.procedures["Znesting 1"]()).toLowerCase() === "42-54".toLowerCase())) { runtime.ext_scratch3_looks._say("pass nesting1", target); } if ((toNotNaN(+thread.procedures["Wwarp fib %s"](12)) === 144)) { @@ -20,7 +19,7 @@ if ((toNotNaN(+thread.procedures["Wfactorial %s"](12)) === 479001600)) { runtime.ext_scratch3_looks._say("pass factorial 12", target); } b0.value = thread.procedures["Zno shadowing 1 %s %s"]("f","g"); -if (compareEqual(b0.value, "")) { +if ((("" + b0.value).toLowerCase() === "".toLowerCase())) { runtime.ext_scratch3_looks._say("pass default return value", target); } runtime.ext_scratch3_looks._say("end", target); @@ -28,20 +27,14 @@ retire(); return; }; }) // Sprite1 Zsimplest -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_simplest () { return "It works!"; return ""; }; }) // Sprite1 Znesting 1 -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_nesting_1 () { thread.procedures["Znesting 2"](); return (("" + thread.procedures["Znesting 3 %s %s"](6,7)) + ("" + thread.procedures["Znesting 3 %s %s"](-1,54))); @@ -49,20 +42,14 @@ return ""; }; }) // Sprite1 Wwarp fib %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_warp_fib_ (p0) { return thread.procedures["Wfib %s"](p0); return ""; }; }) // Sprite1 Wfactorial %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_factorial_ (p0) { if (compareGreaterThan(p0, 1)) { return (toNotNaN(+p0) * toNotNaN(+thread.procedures["Wfactorial %s"]((toNotNaN(+p0) - 1)))); @@ -72,51 +59,39 @@ return ""; }; }) // Sprite1 Zno shadowing 1 %s %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function funXYZ_no_shadowing_1__ (p0,p1) { -if (((("" + p0).toLowerCase() === "f") && (("" + p1).toLowerCase() === "g"))) { +if (((("" + p0).toLowerCase() === "f".toLowerCase()) && (("" + p1).toLowerCase() === "g".toLowerCase()))) { runtime.ext_scratch3_looks._say("pass shadow check 1", target); } b0.value = thread.procedures["Zno shadowing 2 %s %s"](1,2); -if (((("" + p0).toLowerCase() === "f") && (("" + p1).toLowerCase() === "g"))) { +if (((("" + p0).toLowerCase() === "f".toLowerCase()) && (("" + p1).toLowerCase() === "g".toLowerCase()))) { runtime.ext_scratch3_looks._say("pass shadow check 2", target); } b0.value = thread.procedures["Zno shadowing 2 %s %s"](3,4); -if (((("" + p0).toLowerCase() === "f") && (("" + p1).toLowerCase() === "g"))) { +if (((("" + p0).toLowerCase() === "f".toLowerCase()) && (("" + p1).toLowerCase() === "g".toLowerCase()))) { runtime.ext_scratch3_looks._say("pass shadow check 3", target); } return ""; }; }) // Sprite1 Znesting 2 -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_nesting_2 () { return "discard nesting 2"; return ""; }; }) // Sprite1 Znesting 3 %s %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_nesting_3__ (p0,p1) { return (toNotNaN(+p0) * toNotNaN(+p1)); return ""; }; }) // Sprite1 Wfib %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_fib_ (p0) { if (compareLessThan(p0, 2)) { return p0; @@ -127,10 +102,7 @@ return ""; }; }) // Sprite1 Zno shadowing 2 %s %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_no_shadowing_2__ (p0,p1) { return "discard shadow 2"; return ""; diff --git a/test/snapshot/__snapshots__/tw-procedure-return-stops-scripts.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-procedure-return-stops-scripts.sb3.tw-snapshot index f5620fe66bb..bf4562d1098 100644 --- a/test/snapshot/__snapshots__/tw-procedure-return-stops-scripts.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-procedure-return-stops-scripts.sb3.tw-snapshot @@ -2,15 +2,12 @@ // Input SHA-256: 27368530b97e0ab5053bf4faf8fd116aa30cea34adcbd95fc6ddcf0a9d6d4976 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["PsAI*C{QHI3*4?O8p#TM"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); thread.procedures["Wreturn stops the script immediately"](); -if ((toNotNaN(+b0.value) === 25)) { +if ((b0.value === 25)) { runtime.ext_scratch3_looks._say("pass return stopped the script immediately", target); } yield* waitThreads(startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "Test return outside of custom block" })); @@ -22,15 +19,12 @@ retire(); return; }; }) // Sprite1 Wreturn stops the script immediately -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["PsAI*C{QHI3*4?O8p#TM"]; return function funXYZ_return_stops_the_scr () { b0.value = 0; for (var a0 = 100; a0 > 0; a0--) { -b0.value = (toNotNaN(+b0.value) + 1); +b0.value = (b0.value + 1); if ((b0.value === 25)) { return "stopped!"; } @@ -40,10 +34,7 @@ return ""; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["PsAI*C{QHI3*4?O8p#TM"]; return function* genXYZ () { b0.value = 0; diff --git a/test/snapshot/__snapshots__/tw-procedure-return-warp.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-procedure-return-warp.sb3.tw-snapshot index 988b3374e94..b871beebb51 100644 --- a/test/snapshot/__snapshots__/tw-procedure-return-warp.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-procedure-return-warp.sb3.tw-snapshot @@ -2,18 +2,14 @@ // Input SHA-256: e652f448fbf09a37afacb03afa9f3448cce43aef06439b58b44aeec73edb0438 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ () { b0.value = 0; while (true) { b0.value = (toNotNaN(+b0.value) + 1); thread.timer = timer(); -var a0 = max(0, 1000 * -1); +var a0 = Math.max(0, 1000 * -1); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -26,10 +22,7 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 3", target); yield* thread.procedures["Znon warp"](); @@ -39,17 +32,13 @@ retire(); return; }; }) // Sprite1 Znon warp -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ_non_warp () { b0.value = 0; for (var a0 = 5; a0 > 0; a0--) { thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a1) { @@ -61,13 +50,13 @@ yield; if ((toNotNaN(+b0.value) === 5)) { runtime.ext_scratch3_looks._say("pass non warp 1", target); } -if ((("" + (yield* thread.procedures["Wverify runs warp %s"]((yield* thread.procedures["Zverify runs non warp %s"]((yield* thread.procedures["Wverify runs warp %s"]("abc"))))))).toLowerCase() === "warp: non warp: warp: abc")) { +if ((("" + (yield* thread.procedures["Wverify runs warp %s"]((yield* thread.procedures["Zverify runs non warp %s"]((yield* thread.procedures["Wverify runs warp %s"]("abc"))))))).toLowerCase() === "warp: non warp: warp: abc".toLowerCase())) { runtime.ext_scratch3_looks._say("pass non warp and warp mix", target); } b0.value = 0; for (var a2 = 5; a2 > 0; a2--) { thread.timer = timer(); -var a3 = max(0, 1000 * 0); +var a3 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a3) { @@ -83,17 +72,13 @@ return ""; }; }) // Sprite1 Wverify runs warp %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ_verify_runs_warp_ (p0) { b0.value = 0; for (var a0 = 5; a0 > 0; a0--) { thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); while (thread.timer.timeElapsed() < a1) { if (isStuck()) yield; @@ -108,17 +93,13 @@ return ""; }; }) // Sprite1 Zverify runs non warp %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ_verify_runs_non_warp (p0) { b0.value = 0; for (var a0 = 5; a0 > 0; a0--) { thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a1) { diff --git a/test/snapshot/__snapshots__/tw-promise-loop-double-yield-kouzeru.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-promise-loop-double-yield-kouzeru.sb3.tw-snapshot index 72021d15607..608f12c0515 100644 --- a/test/snapshot/__snapshots__/tw-promise-loop-double-yield-kouzeru.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-promise-loop-double-yield-kouzeru.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: f8c5c7c3ba1afbd140646e67d9987964cdcdf0cb30b53a0f6276b11f460e7d25 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["JbF5exWEi*m?-UEmkASS"]; const b1 = stage.variables["[G/@.KGc-4y[(GZ(bt7o"]; const b2 = runtime.getOpcodeFunction("sound_seteffectto"); @@ -24,11 +21,7 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["[G/@.KGc-4y[(GZ(bt7o"]; const b1 = stage.variables["JbF5exWEi*m?-UEmkASS"]; return function* genXYZ () { @@ -41,7 +34,7 @@ b1.value = 50; b1.value = 200; } thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a1) { diff --git a/test/snapshot/__snapshots__/tw-repeat-analysis-doesnt-reanalyze.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-repeat-analysis-doesnt-reanalyze.sb3.tw-snapshot new file mode 100644 index 00000000000..188696ef9c7 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-repeat-analysis-doesnt-reanalyze.sb3.tw-snapshot @@ -0,0 +1,27 @@ +// TW Snapshot +// Input SHA-256: 38075839898d1ba3d2556f350ff18438a205c5b6b3cb809d07d3f738bd37dad9 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +thread.procedures["Wa"](); +if ((("" + b0.value).toLowerCase() === "bwah".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Wa +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = stage.variables["6h7bpiz0`;;x^G1B3(%["]; +return function funXYZ_a () { +b0.value = b1.value.length; +for (var a0 = b0.value; a0 > 0; a0--) { +b0.value = "bwah"; +} +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/tw-repeat-procedure-reporter-infinite-analyzer-loop.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-repeat-procedure-reporter-infinite-analyzer-loop.sb3.tw-snapshot new file mode 100644 index 00000000000..ca239793693 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-repeat-procedure-reporter-infinite-analyzer-loop.sb3.tw-snapshot @@ -0,0 +1,28 @@ +// TW Snapshot +// Input SHA-256: a12680688ca945364abe1e094b35cf53326f70189cb09b58d5f52b4de0c3b2a9 + +// Text script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 0", target); +thread.procedures["Wtest 1"](); +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Text Wtest 1 +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = target.variables["ts-.PQ{/]mN_9@MbG:m/"]; +return function funXYZ_test_1 () { +for (var a0 = toNotNaN(+thread.procedures["Wany procedure reporter"]()); a0 >= 0.5; a0--) { +b0.value = (toNotNaN(+b0.value) + 1); +} +return ""; +}; }) + +// Text Wany procedure reporter +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +return function funXYZ_any_procedure_report () { +return 0; +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/tw-repeat-until-false-item-from-list.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-repeat-until-false-item-from-list.sb3.tw-snapshot new file mode 100644 index 00000000000..aca5b04ea85 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-repeat-until-false-item-from-list.sb3.tw-snapshot @@ -0,0 +1,25 @@ +// TW Snapshot +// Input SHA-256: 28253e645679b429a494dbf17b831edc86513cd417cf2c24c9565cacc29a8817 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["aN^sIH)1L`YhdGV*_C5P"]; +const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +b0.value = []; +b0.value.push(("fal" + "se")); +b0._monitorUpToDate = false; +b0.value.push((1 === 1)); +b0._monitorUpToDate = false; +b1.value = 1; +while (!toBoolean(listGet(b0.value, b1.value))) { +b1.value = (toNotNaN(+b1.value) + 1); +yield; +} +if ((toNotNaN(+b1.value) === 2)) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/tw-restart-broadcast-threads.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-restart-broadcast-threads.sb3.tw-snapshot index 91cb0a7eb4d..8da7bc06f09 100644 --- a/test/snapshot/__snapshots__/tw-restart-broadcast-threads.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-restart-broadcast-threads.sb3.tw-snapshot @@ -2,11 +2,7 @@ // Input SHA-256: 128cc735fefc374c5935e2c3d9c28b7d07c03d58cd0d6abec4e879c41f4afb1c // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); @@ -14,7 +10,7 @@ b0.value = 0; startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "message1" }); startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "message1" }); thread.timer = timer(); -var a0 = max(0, 1000 * 0); +var a0 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -29,10 +25,7 @@ retire(); return; }; }) // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { b0.value = (toNotNaN(+b0.value) + 1); diff --git a/test/snapshot/__snapshots__/tw-rotate-by-decimal-without-leading-zero.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-rotate-by-decimal-without-leading-zero.sb3.tw-snapshot new file mode 100644 index 00000000000..27fd3590b47 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-rotate-by-decimal-without-leading-zero.sb3.tw-snapshot @@ -0,0 +1,16 @@ +// TW Snapshot +// Input SHA-256: 0a7a3ee1aac2ba5b063f53b742ef992e395ee668efa9205279f93f1949e8a755 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +target.setDirection(90); +target.setDirection((target.direction + 0.25)); +target.setDirection((target.direction + 0.25)); +if ((target.direction === 90.5)) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/tw-safe-procedure-argument-casting.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-safe-procedure-argument-casting.sb3.tw-snapshot index a26c822950f..98631100e00 100644 --- a/test/snapshot/__snapshots__/tw-safe-procedure-argument-casting.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-safe-procedure-argument-casting.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 89920bf89edf85596d13e7781c1ea5de2fea61c0adf78ecdd41e4a7ab824aebe // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); thread.procedures["Zswitch %s"]("1"); @@ -21,10 +18,7 @@ retire(); return; }; }) // Sprite1 Zswitch %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_switch_ (p0) { runtime.ext_scratch3_looks._setCostume(target, p0); return ""; diff --git a/test/snapshot/__snapshots__/tw-self-restarting-script-keeps-running-until-yield.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-self-restarting-script-keeps-running-until-yield.sb3.tw-snapshot index 50a840a2a55..accaed1f172 100644 --- a/test/snapshot/__snapshots__/tw-self-restarting-script-keeps-running-until-yield.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-self-restarting-script-keeps-running-until-yield.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: dc029abbf128cea0830f4578e89619949837ec26dfa76f110ca599a9ee12e66e // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["G{NQ*NXG*qzywe1Q3?FM"]; const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { @@ -17,10 +14,7 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; const b1 = stage.variables["G{NQ*NXG*qzywe1Q3?FM"]; return function* genXYZ () { diff --git a/test/snapshot/__snapshots__/tw-sensing-of-non-existent-costume-name.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-sensing-of-non-existent-costume-name.sb3.tw-snapshot new file mode 100644 index 00000000000..b8c983bd5b1 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-sensing-of-non-existent-costume-name.sb3.tw-snapshot @@ -0,0 +1,13 @@ +// TW Snapshot +// Input SHA-256: c3b1a45369f15f6809142ef2a2c6d1a680b802b70524a499b347af1008730a03 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = runtime.getSpriteTargetByName("Sprite2"); +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 0", target); +if ((("" + (b0 ? b0.getCostumes()[b0.currentCostume].name : 0)).toLowerCase() === "a".toLowerCase())) { +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/tw-sensing-of.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-sensing-of.sb3.tw-snapshot index 416da48278f..b574fe72392 100644 --- a/test/snapshot/__snapshots__/tw-sensing-of.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-sensing-of.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 2086fa5dfdd5f98dcafc01064231a018edb5698b3b4cc403a9cfaeabb5125c06 // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage && stage.lookupVariableByNameAndType("Stage variable", "", true); const b1 = runtime.getSpriteTargetByName("Test sprite"); const b2 = b1 && b1.lookupVariableByNameAndType("Private variable", "", true); @@ -17,13 +14,13 @@ runtime.ext_scratch3_looks._say("plan 32", target); if (((stage.currentCostume + 1) === 2)) { runtime.ext_scratch3_looks._say("pass backdrop #", target); } -if ((("" + stage.getCostumes()[stage.currentCostume].name).toLowerCase() === "backdrop name test")) { +if ((stage.getCostumes()[stage.currentCostume].name.toLowerCase() === "Backdrop name test".toLowerCase())) { runtime.ext_scratch3_looks._say("pass backdrop name", target); } if (((stage ? stage.volume : 0) === 45)) { runtime.ext_scratch3_looks._say("pass stage volume", target); } -if ((("" + (b0 ? b0.value : 0)).toLowerCase() === "variable in stage")) { +if ((("" + (b0 ? b0.value : 0)).toLowerCase() === "Variable in stage".toLowerCase())) { runtime.ext_scratch3_looks._say("pass stage variable", target); } if (((b1 ? b1.x : 0) === 19)) { @@ -38,7 +35,7 @@ runtime.ext_scratch3_looks._say("pass direction", target); if (((b1 ? b1.currentCostume + 1 : 0) === 3)) { runtime.ext_scratch3_looks._say("pass costume #", target); } -if ((("" + (b1 ? b1.getCostumes()[b1.currentCostume].name : 0)).toLowerCase() === "costume name test")) { +if ((("" + (b1 ? b1.getCostumes()[b1.currentCostume].name : 0)).toLowerCase() === "Costume name test".toLowerCase())) { runtime.ext_scratch3_looks._say("pass costume name", target); } if (((b1 ? b1.size : 0) === 76.01)) { @@ -47,7 +44,7 @@ runtime.ext_scratch3_looks._say("pass size", target); if (((b1 ? b1.volume : 0) === 14.3)) { runtime.ext_scratch3_looks._say("pass volume", target); } -if ((("" + (b2 ? b2.value : 0)).toLowerCase() === "private variable value")) { +if ((("" + (b2 ? b2.value : 0)).toLowerCase() === "Private variable value".toLowerCase())) { runtime.ext_scratch3_looks._say("pass private variable", target); } if (compareEqual((b3 ? b3.value : 0), 0)) { @@ -90,25 +87,25 @@ runtime.ext_scratch3_looks._say("pass NE volume", target); if (compareEqual(runtime.ext_scratch3_sensing.getAttributeOf({OBJECT: b4.value, PROPERTY: "Private variable" }), 0)) { runtime.ext_scratch3_looks._say("pass NE private variable", target); } -if (compareEqual((b5 ? b5.x : 0), 0)) { +if (((b5 ? b5.x : 0) === 0)) { runtime.ext_scratch3_looks._say("pass NE backdrop #", target); } -if (compareEqual((b5 ? b5.y : 0), 0)) { +if (((b5 ? b5.y : 0) === 0)) { runtime.ext_scratch3_looks._say("pass NE backdrop name", target); } -if (compareEqual((b5 ? b5.direction : 0), 0)) { +if (((b5 ? b5.direction : 0) === 0)) { runtime.ext_scratch3_looks._say("pass NE volume", target); } -if (compareEqual((b5 ? b5.currentCostume + 1 : 0), 0)) { +if (((b5 ? b5.currentCostume + 1 : 0) === 0)) { runtime.ext_scratch3_looks._say("pass NE stage variable", target); } if (compareEqual((b5 ? b5.getCostumes()[b5.currentCostume].name : 0), 0)) { runtime.ext_scratch3_looks._say("pass NE x", target); } -if (compareEqual((b5 ? b5.size : 0), 0)) { +if (((b5 ? b5.size : 0) === 0)) { runtime.ext_scratch3_looks._say("pass NE y", target); } -if (compareEqual((b5 ? b5.volume : 0), 0)) { +if (((b5 ? b5.volume : 0) === 0)) { runtime.ext_scratch3_looks._say("pass NE direction", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/tw-simple-string-operations.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-simple-string-operations.sb3.tw-snapshot new file mode 100644 index 00000000000..d258651feb7 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-simple-string-operations.sb3.tw-snapshot @@ -0,0 +1,35 @@ +// TW Snapshot +// Input SHA-256: e6a6f5ea252886949eab2f4b5608526dc3686160d65f6e07c2d864c82db24326 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["PJl9-2GypE.OstQk*B_*"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +thread.procedures["Wa"](); +if ((b0.value.toLowerCase() === "babab".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Wa +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["uEt-Ix{%|r3`}-W%+kdm"]; +const b1 = stage.variables["PJl9-2GypE.OstQk*B_*"]; +const b2 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function funXYZ_a () { +b0.value = "ababa"; +b1.value = ""; +b2.value = 1; +for (var a0 = b0.value.length; a0 > 0; a0--) { +if ((((b0.value)[b2.value - 1] || "").toLowerCase() === "a".toLowerCase())) { +b1.value = (b1.value + "b"); +} else { +b1.value = (b1.value + "a"); +} +b2.value = (b2.value + 1); +} +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/tw-sound-menu-avoids-number-literal-if-name-conflict.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-sound-menu-avoids-number-literal-if-name-conflict.sb3.tw-snapshot new file mode 100644 index 00000000000..69eaca7f0d6 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-sound-menu-avoids-number-literal-if-name-conflict.sb3.tw-snapshot @@ -0,0 +1,20 @@ +// TW Snapshot +// Input SHA-256: 91090a2de3ee7db914230fa0aa354e89d6b1781b5a730a71986b018b5f217f18 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 2", target); +b0.value = "5"; +runtime.ext_scratch3_looks._setCostume(target, "costume1"); +if (((target.currentCostume + 1) === 1)) { +runtime.ext_scratch3_looks._say("pass initial costume", target); +} +runtime.ext_scratch3_looks._setCostume(target, b0.value); +if (((target.currentCostume + 1) === 3)) { +runtime.ext_scratch3_looks._say("pass costume \"5\"", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/tw-stage-cannot-move-layers.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-stage-cannot-move-layers.sb3.tw-snapshot index 30d845e8cdc..685797599df 100644 --- a/test/snapshot/__snapshots__/tw-stage-cannot-move-layers.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-stage-cannot-move-layers.sb3.tw-snapshot @@ -2,17 +2,13 @@ // Input SHA-256: 5592b1a64924003352fa3d2d9157c797689a702f55ba39c73a5e0bc862f57e59 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); b0.value = "Initial"; thread.timer = timer(); -var a0 = max(0, 1000 * 0); +var a0 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -25,32 +21,23 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { -if ((("" + b0.value).toLowerCase() === "initial")) { +if ((("" + b0.value).toLowerCase() === "Initial".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } retire(); return; }; }) // Stage script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { retire(); return; }; }) // Stage script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = target.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { b0.value = "Stage callback"; diff --git a/test/snapshot/__snapshots__/tw-state-analysis-understands-stop-this-script.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-state-analysis-understands-stop-this-script.sb3.tw-snapshot new file mode 100644 index 00000000000..0078fee3bd0 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-state-analysis-understands-stop-this-script.sb3.tw-snapshot @@ -0,0 +1,29 @@ +// TW Snapshot +// Input SHA-256: 7f99a41ef716935ae486087d8adf955cbd853c893bc94e58e4cc1c46ad1a7883 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["KMKx1gRubgLz,!L]^TBS"]; +const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +thread.procedures["Wtest"](); +if ((("" + listGet(b0.value, b1.value)).toLowerCase() === "thing".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Wtest +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["yz}9Y:gLL0ZWEs}l)s+Q"]; +const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function funXYZ_test () { +if ((("" + b0.value).toLowerCase() === "true".toLowerCase())) { +b1.value = "last"; +return ""; +} +b1.value = (1 + 2); +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/tw-subtract-can-return-nan.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-subtract-can-return-nan.sb3.tw-snapshot index 848f9080f9d..d48db9ac3fa 100644 --- a/test/snapshot/__snapshots__/tw-subtract-can-return-nan.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-subtract-can-return-nan.sb3.tw-snapshot @@ -2,13 +2,12 @@ // Input SHA-256: f54b97baf31500c1b6bd5b9865ce96b8aeef1001169bbe4550bbcbff84f2dae6 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); +if (!((Infinity - Infinity) <= 0)) { runtime.ext_scratch3_looks._say("pass", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/tw-tab-equals-zero.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-tab-equals-zero.sb3.tw-snapshot index ffac27c3480..a55f7db71ab 100644 --- a/test/snapshot/__snapshots__/tw-tab-equals-zero.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-tab-equals-zero.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 86c1734c101ee85e6f737f891d6ca338d72b17026ab60d289ea7861351c65124 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Kl,Own0m6{^v3$E{Wsc="]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 6", target); @@ -15,24 +12,25 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Kl,Own0m6{^v3$E{Wsc="]; return function* genXYZ () { -if (compareEqual(b0.value, 0)) { +if (compareEqual(b0.value, ("0" + ""))) { runtime.ext_scratch3_looks._say("pass \\t in a variable = string 0", target); } +if (compareEqual("\t", ("0" + ""))) { runtime.ext_scratch3_looks._say("pass literal \\t = string 0", target); -if (compareEqual((" " + ("" + b0.value)), 0)) { +} +if (compareEqual((" " + ("" + b0.value)), ("0" + ""))) { runtime.ext_scratch3_looks._say("pass \\t and other spaces = string 0", target); } -if (compareEqual(b0.value, 0)) { +if (compareEqual(b0.value, (0 + 0))) { runtime.ext_scratch3_looks._say("pass \\t in a variable = number 0", target); } +if ((0 === (0 + 0))) { runtime.ext_scratch3_looks._say("pass literal \\t = number 0", target); -if (compareEqual((" " + ("" + b0.value)), 0)) { +} +if (compareEqual((" " + ("" + b0.value)), (0 + 0))) { runtime.ext_scratch3_looks._say("pass \\t and other spaces = number 0", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/tw-tangent-variable.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-tangent-variable.sb3.tw-snapshot index 4c5b566265b..f60a9d66565 100644 --- a/test/snapshot/__snapshots__/tw-tangent-variable.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-tangent-variable.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 43dcff5e846d45386f48c6abe43837fd1897103159da213feb9b8283ed63e971 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 4", target); target.setXY(45, 0); diff --git a/test/snapshot/__snapshots__/tw-tangent.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-tangent.sb3.tw-snapshot index 4bf8b2e50ed..0fae46c5922 100644 --- a/test/snapshot/__snapshots__/tw-tangent.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-tangent.sb3.tw-snapshot @@ -2,27 +2,54 @@ // Input SHA-256: 1446684578b41ff41cf29fbe14696ef717cca636e8d46babd7d9dec6df723a33 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 15", target); +if (compareEqual(tan(0), 0)) { runtime.ext_scratch3_looks._say("pass 0", target); +} +if ((toNotNaN(tan(90)) === Infinity)) { runtime.ext_scratch3_looks._say("pass 90", target); +} +if (compareEqual(tan(180), 0)) { runtime.ext_scratch3_looks._say("pass 180", target); +} +if ((toNotNaN(tan(270)) === -Infinity)) { runtime.ext_scratch3_looks._say("pass 270", target); +} +if (compareEqual(tan(360), 0)) { runtime.ext_scratch3_looks._say("pass 360", target); +} +if ((toNotNaN(tan(450)) === Infinity)) { runtime.ext_scratch3_looks._say("pass 450", target); +} +if (compareEqual(tan(540), 0)) { runtime.ext_scratch3_looks._say("pass 540", target); +} +if ((toNotNaN(tan(630)) === -Infinity)) { runtime.ext_scratch3_looks._say("pass 630", target); +} +if (compareEqual(tan(720), 0)) { runtime.ext_scratch3_looks._say("pass 720", target); +} +if ((toNotNaN(tan(810)) === Infinity)) { runtime.ext_scratch3_looks._say("pass 810", target); +} +if ((toNotNaN(tan(-90)) === -Infinity)) { runtime.ext_scratch3_looks._say("pass -90", target); +} +if (compareEqual(tan(-180), 0)) { runtime.ext_scratch3_looks._say("pass -180", target); +} +if ((toNotNaN(tan(-270)) === Infinity)) { runtime.ext_scratch3_looks._say("pass -270", target); +} +if (compareEqual(tan(-360), 0)) { runtime.ext_scratch3_looks._say("pass -360", target); +} +if ((toNotNaN(tan(-450)) === -Infinity)) { runtime.ext_scratch3_looks._say("pass -450", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/tw-true-equals-1.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-true-equals-1.sb3.tw-snapshot new file mode 100644 index 00000000000..e4a9a048854 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-true-equals-1.sb3.tw-snapshot @@ -0,0 +1,38 @@ +// TW Snapshot +// Input SHA-256: 70cf221f35f1459c3b81ece31ed7b377098ff26eeafb66eba3788dd82c90bdd5 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["{vwNMZe-LO,q/k3(A,.`"]; +const b1 = stage.variables["DKX$)W98mALB-eeMoj(d"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 8", target); +if (!("true".toLowerCase() === "1".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +if (!("1".toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +if (((+(2 === 2)) === 1)) { +runtime.ext_scratch3_looks._say("pass", target); +} +if ((1 === (+(2 === 2)))) { +runtime.ext_scratch3_looks._say("pass", target); +} +b0.value = (2 === 2); +b1.value = ("tr" + "ue"); +if (!(toNotNaN(+b1.value) === 1)) { +runtime.ext_scratch3_looks._say("pass", target); +} +if (!(1 === toNotNaN(+b1.value))) { +runtime.ext_scratch3_looks._say("pass", target); +} +if (((+b0.value) === 1)) { +runtime.ext_scratch3_looks._say("pass", target); +} +if ((1 === (+b0.value))) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/tw-unsafe-equals.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-unsafe-equals.sb3.tw-snapshot index c27b2fea307..35c87417158 100644 --- a/test/snapshot/__snapshots__/tw-unsafe-equals.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-unsafe-equals.sb3.tw-snapshot @@ -2,34 +2,35 @@ // Input SHA-256: badd564b5bce22a82223511c91ba701da5314e5ad83e46a08ea5f401a4338b20 // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables[",OktMIwz{~bdgWnPEa8u"]; const b1 = stage.variables["yfy(G`K5K^fJcXAfiN4i"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 14", target); +if ((10 === 10)) { runtime.ext_scratch3_looks._say("pass 1", target); +} +if ((10 === 10)) { runtime.ext_scratch3_looks._say("pass 2", target); +} b0.value = 10; -if ((toNotNaN(+b0.value) === 10)) { +if ((b0.value === 10)) { runtime.ext_scratch3_looks._say("pass 3", target); } -if (compareEqual(b0.value, "010")) { +if ((b0.value === 10)) { runtime.ext_scratch3_looks._say("pass 4", target); } -if (compareEqual(b0.value, "0000000010")) { +if ((b0.value === 10)) { runtime.ext_scratch3_looks._say("pass 5", target); } for (var a0 = 1; a0 > 0; a0--) { if ((toNotNaN(+b0.value) === 10)) { runtime.ext_scratch3_looks._say("pass 6", target); } -if (compareEqual(b0.value, "010")) { +if ((toNotNaN(+b0.value) === 10)) { runtime.ext_scratch3_looks._say("pass 7", target); } -if (compareEqual(b0.value, "0000000010")) { +if ((toNotNaN(+b0.value) === 10)) { runtime.ext_scratch3_looks._say("pass 8", target); } yield; @@ -38,24 +39,45 @@ b1.value = "010"; if ((toNotNaN(+b1.value) === 10)) { runtime.ext_scratch3_looks._say("pass 9", target); } -if (compareEqual(b1.value, "010")) { +if ((toNotNaN(+b1.value) === 10)) { runtime.ext_scratch3_looks._say("pass 10", target); } -if (compareEqual(b1.value, "0000000010")) { +if ((toNotNaN(+b1.value) === 10)) { runtime.ext_scratch3_looks._say("pass 11", target); } for (var a1 = 1; a1 > 0; a1--) { if ((toNotNaN(+b1.value) === 10)) { runtime.ext_scratch3_looks._say("pass 12", target); } -if (compareEqual(b1.value, "010")) { +if ((toNotNaN(+b1.value) === 10)) { runtime.ext_scratch3_looks._say("pass 13", target); } -if (compareEqual(b1.value, "0000000010")) { +if ((toNotNaN(+b1.value) === 10)) { runtime.ext_scratch3_looks._say("pass 14", target); } yield; } +if (("".toLowerCase() === "1".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} +if (("1".toLowerCase() === "".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} +if ((" ".toLowerCase() === "1".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} +if ((" ".toLowerCase() === "0".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} +if (("0".toLowerCase() === " ".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} +if (("".toLowerCase() === "0".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} +if (("0".toLowerCase() === "".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/tw-variadic-divide-nan.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-variadic-divide-nan.sb3.tw-snapshot index e42bf6bc7a7..54ac1d1dfc4 100644 --- a/test/snapshot/__snapshots__/tw-variadic-divide-nan.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-variadic-divide-nan.sb3.tw-snapshot @@ -2,26 +2,24 @@ // Input SHA-256: 08f68e9596033cbccc0ceef75cb1c105f167293e03bb42363de679bb09d280e7 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = runtime.getOpcodeFunction("operator_divide"); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 3", target); target.setXY(0, 0); -if (compareEqual((toNotNaN((toNotNaN((0 / limitPrecision(target.x))) / 0)) / 3), 0)) { +if (compareEqual((yield* executeInCompatibilityLayer({"NUM1":"","NUM2":limitPrecision(target.x),"NUM3":"abc","NUM4":3,"mutation":{"tagName":"mutation","children":[],"itemcount":"4"},}, b0, false, false, "d0", null)), 0)) { runtime.ext_scratch3_looks._say("pass div 0", target); } else { runtime.ext_scratch3_looks._say("fail div 0 (want 0)", target); } target.setXY(6, 0); -if (((toNotNaN((toNotNaN((12 / limitPrecision(target.x))) / 0)) / 2) === Infinity)) { +if ((toNotNaN(+(yield* executeInCompatibilityLayer({"NUM1":12,"NUM2":limitPrecision(target.x),"NUM3":"q","NUM4":2,"mutation":{"tagName":"mutation","children":[],"itemcount":"4"},}, b0, false, false, "d1", null))) === Infinity)) { runtime.ext_scratch3_looks._say("pass div 1", target); } else { runtime.ext_scratch3_looks._say("fail div 1 (want Infinity)", target); } target.setXY(4, 0); -if (((toNotNaN((8 / limitPrecision(target.x))) / 2) === 1)) { +if ((toNotNaN(+(yield* executeInCompatibilityLayer({"NUM1":8,"NUM2":limitPrecision(target.x),"NUM3":2,"mutation":{"tagName":"mutation","children":[],"itemcount":"3"},}, b0, false, false, "d2", null))) === 1)) { runtime.ext_scratch3_looks._say("pass div 2", target); } else { runtime.ext_scratch3_looks._say("fail div 2 (want 1)", target); diff --git a/test/snapshot/__snapshots__/tw-wait-until-condition-gh-277.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-wait-until-condition-gh-277.sb3.tw-snapshot new file mode 100644 index 00000000000..02b2fc4738c --- /dev/null +++ b/test/snapshot/__snapshots__/tw-wait-until-condition-gh-277.sb3.tw-snapshot @@ -0,0 +1,33 @@ +// TW Snapshot +// Input SHA-256: 2422e407892596fbf410e032196131f9bae718563fd80b1ff32cf972859c034b + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 0", target); +startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "message1" }); +b0.value = "bwah"; +while (!(("" + b0.value).toLowerCase() === "bleh".toLowerCase())) { +yield; +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +b0.value = (1 + 2); +thread.timer = timer(); +var a0 = Math.max(0, 1000 * 0); +runtime.requestRedraw(); +yield; +while (thread.timer.timeElapsed() < a0) { +yield; +} +thread.timer = null; +b0.value = "bleh"; +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/tw-warp-loop-condition-analysis.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-warp-loop-condition-analysis.sb3.tw-snapshot new file mode 100644 index 00000000000..2d5bbe8de16 --- /dev/null +++ b/test/snapshot/__snapshots__/tw-warp-loop-condition-analysis.sb3.tw-snapshot @@ -0,0 +1,38 @@ +// TW Snapshot +// Input SHA-256: 95d4c128e84ee992b48ed20653ba70b0f6c2d404c4f7088fa654676cd6b7c53c + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables[";~q(!vt3c.Jrz2M]ZMy]"]; +const b1 = stage.variables[",23fjp~KN1aMG|;66K@Z"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +b0.value = []; +b0.value.push((1 + 2)); +b0._monitorUpToDate = false; +b0.value.push((3 + 4)); +b0._monitorUpToDate = false; +b0.value.push("final"); +b0._monitorUpToDate = false; +thread.procedures["Wtest"](); +if ((b1.value === 4)) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Wtest +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = stage.variables[",23fjp~KN1aMG|;66K@Z"]; +const b2 = stage.variables[";~q(!vt3c.Jrz2M]ZMy]"]; +return function funXYZ_test () { +b0.value = ""; +b1.value = 1; +while (!(("" + b0.value).toLowerCase() === "final".toLowerCase())) { +b0.value = (b2.value[b1.value - 1] ?? ""); +b1.value = (b1.value + 1); +} +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/tw-warp-repeat-until-timer-greater-than.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-warp-repeat-until-timer-greater-than.sb3.tw-snapshot index 62c334a968d..90dd7011df2 100644 --- a/test/snapshot/__snapshots__/tw-warp-repeat-until-timer-greater-than.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-warp-repeat-until-timer-greater-than.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 2ae215411916e72c845c0f613d5b93f017b16af3010c6f4b0bbb3d1087eec301 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); yield* thread.procedures["Wrun without screen refresh"](); @@ -14,13 +11,10 @@ retire(); return; }; }) // Sprite1 Wrun without screen refresh -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["F?*}X,`9XBpN_[piGRrz"]; return function* genXYZ_run_without_screen_r () { -b0.value = (toNotNaN((daysSince2000() * 86400)) + 3); +b0.value = ((daysSince2000() * 86400) + 3); runtime.ioDevices.clock.resetProjectTimer(); while (!((runtime.ioDevices.clock.projectTimer() > 0.1) || compareGreaterThan((daysSince2000() * 86400), b0.value))) { if (isStuck()) yield; diff --git a/test/snapshot/__snapshots__/tw-when-backdrop-switches-to-next-backdrop.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-when-backdrop-switches-to-next-backdrop.sb3.tw-snapshot index e4c67f60056..8b5cdd42bd8 100644 --- a/test/snapshot/__snapshots__/tw-when-backdrop-switches-to-next-backdrop.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-when-backdrop-switches-to-next-backdrop.sb3.tw-snapshot @@ -2,20 +2,14 @@ // Input SHA-256: ae6b920864ec07bc5a36b4af493b1646e54241abadabfa7bf962b43610ad926d // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 0", target); runtime.ext_scratch3_looks._setBackdrop(stage, stage.currentCostume + 1, true); diff --git a/test/snapshot/__snapshots__/tw-when-backdrop-switches-to-switch-backdrop-to.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-when-backdrop-switches-to-switch-backdrop-to.sb3.tw-snapshot index fc615070f27..a6ef03ebdb4 100644 --- a/test/snapshot/__snapshots__/tw-when-backdrop-switches-to-switch-backdrop-to.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-when-backdrop-switches-to-switch-backdrop-to.sb3.tw-snapshot @@ -2,20 +2,14 @@ // Input SHA-256: 503e54070a6a749f8ffbcfad08d64cff3c1abb9400a7519b623b3876bd97e54a // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 0", target); runtime.ext_scratch3_looks._setBackdrop(stage, "backdrop2"); diff --git a/test/snapshot/__snapshots__/tw-zombie-cube-escape-284516654.sb3.tw-snapshot b/test/snapshot/__snapshots__/tw-zombie-cube-escape-284516654.sb3.tw-snapshot index 81566429f6b..7ed5bde1fc6 100644 --- a/test/snapshot/__snapshots__/tw-zombie-cube-escape-284516654.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/tw-zombie-cube-escape-284516654.sb3.tw-snapshot @@ -2,17 +2,14 @@ // Input SHA-256: 6fe809479042e5ba09d66bffbd62d5a38d2265c98818e937d63137d2dcdc2fec // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["7qur6!bGgvC9I(Nd5.HP"]; const b1 = stage.variables["sUOp@-6J4y0PqwiXit4!"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); b0.value = 0; b1.value = ""; -while (!compareGreaterThan(b1.value, "")) { +while (!(("" + b1.value).toLowerCase() > "".toLowerCase())) { startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "step" }); yield; } @@ -22,10 +19,7 @@ retire(); return; }; }) // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["7qur6!bGgvC9I(Nd5.HP"]; const b1 = stage.variables["sUOp@-6J4y0PqwiXit4!"]; return function* genXYZ () { diff --git a/test/snapshot/__snapshots__/warp-timer/mw-get-from-list.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/mw-get-from-list.sb3.tw-snapshot index 8cba2c167e9..60393bf45cd 100644 --- a/test/snapshot/__snapshots__/warp-timer/mw-get-from-list.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/mw-get-from-list.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: d758181c076886d498d4e14ea70e79759694c2f18910f309a1bb82861025f740 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["T}0U^Nr!iDn]OXVLQ!DT"]; const b1 = stage.variables["xiK*4nt~,{Bb#*%f|{9p"]; const b2 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; @@ -13,30 +10,27 @@ return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 3", target); b0.value = []; b0.value.push("thing"); +b0._monitorUpToDate = false; b1.value = 1; -b2.value = (b0.value[0] ?? ""); -if ((("" + b2.value).toLowerCase() === "thing")) { +b2.value = (b0.value[b1.value - 1] ?? ""); +if ((("" + b2.value).toLowerCase() === "thing".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } -b2.value = (b0.value[((toNotNaN(+b1.value) + 1) | 0) - 1] ?? ""); -if (compareEqual(b2.value, "")) { +b2.value = (b0.value[(b1.value + 1) - 1] ?? ""); +if ((("" + b2.value).toLowerCase() === "".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } -b1.value = 2; -b2.value = (b0.value[((toNotNaN(+b1.value) - 1) | 0) - 1] ?? ""); -if ((("" + b2.value).toLowerCase() === "thing")) { +thread.procedures["Zdo funny"](); +b2.value = (b0.value[(b1.value - 1) - 1] ?? ""); +if ((("" + b2.value).toLowerCase() === "thing".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } runtime.ext_scratch3_looks._say("end", target); -b0._monitorUpToDate = false; retire(); return; }; }) // Sprite1 Zdo funny -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["xiK*4nt~,{Bb#*%f|{9p"]; return function funXYZ_do_funny () { b0.value = 2; diff --git a/test/snapshot/__snapshots__/warp-timer/order-library-reverse.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/order-library-reverse.sb3.tw-snapshot index 89e824ed1d0..dc849cf46e2 100644 --- a/test/snapshot/__snapshots__/warp-timer/order-library-reverse.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/order-library-reverse.sb3.tw-snapshot @@ -2,17 +2,13 @@ // Input SHA-256: b677669506b60e3ba350be8ae545db93d7bcbb5f368ba21d86b0d4e966e7e09c // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["p]KODv+)+:l=%NT~j3/d-order"]; const b1 = stage.variables["p]KODv+)+:l=%NT~j3/d-wait"]; return function* genXYZ () { b0.value = 0; thread.timer = timer(); -var a0 = max(0, 1000 * toNotNaN(+b1.value)); +var a0 = Math.max(0, 1000 * toNotNaN(+b1.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -29,16 +25,12 @@ retire(); return; }; }) // Sprite3 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["p]KODv+)+:l=%NT~j3/d-wait"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); thread.timer = timer(); -var a0 = max(0, 1000 * toNotNaN(+b0.value)); +var a0 = Math.max(0, 1000 * toNotNaN(+b0.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -46,7 +38,7 @@ yield; } thread.timer = null; thread.timer = timer(); -var a1 = max(0, 1000 * toNotNaN(+b0.value)); +var a1 = Math.max(0, 1000 * toNotNaN(+b0.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a1) { @@ -54,7 +46,7 @@ yield; } thread.timer = null; thread.timer = timer(); -var a2 = max(0, 1000 * toNotNaN(+b0.value)); +var a2 = Math.max(0, 1000 * toNotNaN(+b0.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a2) { @@ -66,17 +58,13 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["p]KODv+)+:l=%NT~j3/d-order"]; const b1 = stage.variables["p]KODv+)+:l=%NT~j3/d-wait"]; return function* genXYZ () { b0.value = 0; thread.timer = timer(); -var a0 = max(0, 1000 * toNotNaN(+b1.value)); +var a0 = Math.max(0, 1000 * toNotNaN(+b1.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { diff --git a/test/snapshot/__snapshots__/warp-timer/order-library.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/order-library.sb3.tw-snapshot index 137a3bd6c29..c2b537cdcd5 100644 --- a/test/snapshot/__snapshots__/warp-timer/order-library.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/order-library.sb3.tw-snapshot @@ -2,16 +2,12 @@ // Input SHA-256: 7f0df1e9c4a6b87f8bbea53b22d5a1201ebe774e535661cef5da3bd75af45c11 // Sprite3 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["):/PVGTvoVRvq(ikGwRE-wait"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); thread.timer = timer(); -var a0 = max(0, 1000 * toNotNaN(+b0.value)); +var a0 = Math.max(0, 1000 * toNotNaN(+b0.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -19,7 +15,7 @@ yield; } thread.timer = null; thread.timer = timer(); -var a1 = max(0, 1000 * toNotNaN(+b0.value)); +var a1 = Math.max(0, 1000 * toNotNaN(+b0.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a1) { @@ -27,7 +23,7 @@ yield; } thread.timer = null; thread.timer = timer(); -var a2 = max(0, 1000 * toNotNaN(+b0.value)); +var a2 = Math.max(0, 1000 * toNotNaN(+b0.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a2) { @@ -39,17 +35,13 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["):/PVGTvoVRvq(ikGwRE-order"]; const b1 = stage.variables["):/PVGTvoVRvq(ikGwRE-wait"]; return function* genXYZ () { b0.value = 0; thread.timer = timer(); -var a0 = max(0, 1000 * toNotNaN(+b1.value)); +var a0 = Math.max(0, 1000 * toNotNaN(+b1.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -66,17 +58,13 @@ retire(); return; }; }) // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["):/PVGTvoVRvq(ikGwRE-order"]; const b1 = stage.variables["):/PVGTvoVRvq(ikGwRE-wait"]; return function* genXYZ () { b0.value = 0; thread.timer = timer(); -var a0 = max(0, 1000 * toNotNaN(+b1.value)); +var a0 = Math.max(0, 1000 * toNotNaN(+b1.value)); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { diff --git a/test/snapshot/__snapshots__/warp-timer/tw-NaN.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-NaN.sb3.tw-snapshot index 6ea74252546..92d8d79e74f 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-NaN.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-NaN.sb3.tw-snapshot @@ -1,33 +1,72 @@ // TW Snapshot -// Input SHA-256: 2c124b6184d3cbeb3d692ba7a04266d8bf141c650a9cc43b28faf59ac394ee16 +// Input SHA-256: 7916f21ea252ad0887060c6eb7ade266b41077b30ed849ad33947e01e6f73514 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = runtime.getOpcodeFunction("operator_multiply"); return function* genXYZ () { -runtime.ext_scratch3_looks._say("plan 20", target); +runtime.ext_scratch3_looks._say("plan 21", target); +if (!(("" + (0 / 0)).toLowerCase() === "0".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + (0 * Infinity)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (compareEqual((yield* executeInCompatibilityLayer({"NUM1":0,"NUM2":Infinity,"NUM3":1,"mutation":{"tagName":"mutation","children":[],"itemcount":"3"},}, b0, false, false, "E", null)), 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + ((Math.acos(1.01) * 180) / Math.PI)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN(((Math.acos(1.01) * 180) / Math.PI)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + ((Math.asin(1.01) * 180) / Math.PI)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN(((Math.asin(1.01) * 180) / Math.PI)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + (0 / 0)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN((0 / 0)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + Math.sqrt(-1)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN(Math.sqrt(-1)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + mod(0, 0)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN(mod(0, 0)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + Math.log(-1)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN(Math.log(-1)) * 1) === 0)) { +runtime.ext_scratch3_looks._say("pass", target); +} +if ((("" + (Math.log(-1) / Math.LN10)).toLowerCase() === "NaN".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN((Math.log(-1) / Math.LN10)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN((Math.round(Math.sin((Math.PI * (1 / 0)) / 180) * 1e10) / 1e10)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN((Math.round(Math.cos((Math.PI * (1 / 0)) / 180) * 1e10) / 1e10)) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((toNotNaN(tan((1 / 0))) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); -if (compareEqual((toNotNaN(runtime.ext_scratch3_operators._random(-Infinity, Infinity)) * 1), 0)) { +} +if (((toNotNaN(runtime.ext_scratch3_operators._random((-1 / 0), (1 / 0))) * 1) === 0)) { runtime.ext_scratch3_looks._say("pass", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-add-can-return-nan.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-add-can-return-nan.sb3.tw-snapshot index 722afbd7f78..7ce7b186e9b 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-add-can-return-nan.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-add-can-return-nan.sb3.tw-snapshot @@ -2,13 +2,12 @@ // Input SHA-256: b435d9356099286cb062435cc2eb968544bcbcd9213e2b6da902eb3bb689f425 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); +if (!((Infinity + -Infinity) <= 0)) { runtime.ext_scratch3_looks._say("pass", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-all-at-once.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-all-at-once.sb3.tw-snapshot index 9a70c6ec8e8..beca8936c7b 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-all-at-once.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-all-at-once.sb3.tw-snapshot @@ -2,13 +2,12 @@ // Input SHA-256: 428175715a6d8670b809c69bdda12e5043eff9921ccdd908507636a625938702 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); +if (true) { runtime.ext_scratch3_looks._say("pass", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-analyze-yields-due-to-direct-recursion.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-analyze-yields-due-to-direct-recursion.sb3.tw-snapshot new file mode 100644 index 00000000000..32435b0af57 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-analyze-yields-due-to-direct-recursion.sb3.tw-snapshot @@ -0,0 +1,38 @@ +// TW Snapshot +// Input SHA-256: 848a4efc16b174b53f0a4b581e6b6d1091ae9eaa916e040c963e360ce3883509 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = stage.variables["FpLI$ida6)qR,q~y`1|*"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +b0.value = (1 + 2); +yield* thread.procedures["Znon-warp recursion %s"](2); +if ((("" + listGet(b1.value, b0.value)).toLowerCase() === "the only thing".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Znon-warp recursion %s +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +return function* genXYZ_non_warp_recursion_ (p0) { +if (compareGreaterThan(p0, 0)) { +yield; +yield* thread.procedures["Znon-warp recursion %s"]((toNotNaN(+p0) - 1)); +} +return ""; +}; }) + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +for (var a0 = 1; a0 > 0; a0--) { +yield; +} +b0.value = "random"; +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-automatic-variable-creation-literal-null-id.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-automatic-variable-creation-literal-null-id.sb3.tw-snapshot new file mode 100644 index 00000000000..d3a2c80cab3 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-automatic-variable-creation-literal-null-id.sb3.tw-snapshot @@ -0,0 +1,12 @@ +// TW Snapshot +// Input SHA-256: 4764ae15e39b22b1a071c9ac79f8758f24ef41855802db8674e200fd26139ed0 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = target.variables["null"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 0", target); +b0.value = 5; +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-block-with-null-for-variable-id.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-block-with-null-for-variable-id.sb3.tw-snapshot new file mode 100644 index 00000000000..153276f7b89 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-block-with-null-for-variable-id.sb3.tw-snapshot @@ -0,0 +1,36 @@ +// TW Snapshot +// Input SHA-256: 99bb22ac4fb2542ce3c21fa7d2025f03d15392a33850585a4d12f4ec558663ac + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = stage.variables[")|GMR5fz;%F_H,c0wGVM"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 2", target); +b0.value = 1; +b1.value = 2; +yield* waitThreads(startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "check 1" })); +yield* waitThreads(startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "check 2" })); +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +if ((toNotNaN(+b0.value) === 1)) { +runtime.ext_scratch3_looks._say("pass variable 1", target); +} +retire(); return; +}; }) + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables[")|GMR5fz;%F_H,c0wGVM"]; +return function* genXYZ () { +if ((toNotNaN(+b0.value) === 2)) { +runtime.ext_scratch3_looks._say("pass variable 2", target); +} +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-boolean-arguments-are-not-cast.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-boolean-arguments-are-not-cast.sb3.tw-snapshot index 434ef1391cf..b7aca7680ef 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-boolean-arguments-are-not-cast.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-boolean-arguments-are-not-cast.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 9ecff9e3c4b1dcdf3e23d0e49c0a2da3de446b6d626a2b5ee39d761be20344ca // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); thread.procedures["ZBlock A %s"]("Hai!!!"); @@ -14,12 +11,9 @@ retire(); return; }; }) // Sprite1 ZBlock A %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_Block_A_ (p0) { -if ((("" + p0).toLowerCase() === "hai!!!")) { +if ((("" + p0).toLowerCase() === "Hai!!!".toLowerCase())) { runtime.ext_scratch3_looks._say("pass did not cast", target); } else { runtime.ext_scratch3_looks._say("fail was casted", target); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-broadcast-id-and-name-desync.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-broadcast-id-and-name-desync.sb3.tw-snapshot index 4768f90d2c8..42f3cd396bf 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-broadcast-id-and-name-desync.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-broadcast-id-and-name-desync.sb3.tw-snapshot @@ -2,20 +2,14 @@ // Input SHA-256: f2d984762d77ff375ba3e39b5d57190b71a131f0d8620d2becb2735b7da116c3 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("pass", target); retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); yield* waitThreads(startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "message1" })); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-change-size-does-not-use-rounded-size.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-change-size-does-not-use-rounded-size.sb3.tw-snapshot index 29b19553a9a..4d1afe46852 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-change-size-does-not-use-rounded-size.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-change-size-does-not-use-rounded-size.sb3.tw-snapshot @@ -2,19 +2,15 @@ // Input SHA-256: d1f532866d8de3d81185db7ecb94ecaa4e7549feb4e26ee4f849cd0aaf1bb154 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const round=Math.round; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); target.setSize(96); b0.value = 0; -while (!(100 === round(target.size))) { +while (!(100 === Math.round(target.size))) { b0.value = (toNotNaN(+b0.value) + 1); -target.setSize(target.size + ((100 - round(target.size)) / 10)); +target.setSize(target.size + ((100 - Math.round(target.size)) / 10)); yield; } if ((toNotNaN(+b0.value) === 20)) { diff --git a/test/snapshot/__snapshots__/warp-timer/tw-color-input-returns-hex.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-color-input-returns-hex.sb3.tw-snapshot index da9451ac250..56b3817737b 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-color-input-returns-hex.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-color-input-returns-hex.sb3.tw-snapshot @@ -2,15 +2,14 @@ // Input SHA-256: 28a59bb79ba328f31ac0b79f49143a2513080e30a7383fda80579d08021c3c82 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); b0.value = "#22388a"; +if ((b0.value.toLowerCase() === "#22388a".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-comparison-matrix-inline.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-comparison-matrix-inline.sb3.tw-snapshot index 865dc2c0fc4..077f68f4d5d 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-comparison-matrix-inline.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-comparison-matrix-inline.sb3.tw-snapshot @@ -2,12 +2,1773 @@ // Input SHA-256: a419afcd49227908f6e7639bf006dca32430d3b406fbd9cd72aa14957d95ab67 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 0", target); +if (!(("" + (0 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 1: 0 should be < 0", target); +} +if (!(("" + (0 === 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 2: 0 should be = 0", target); +} +if (!(("" + (0 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 3: 0 should be > 0", target); +} +if (!(("" + (0 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 4: 0 should be < 0.0", target); +} +if (!(("" + (0 === 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 5: 0 should be = 0.0", target); +} +if (!(("" + (0 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 6: 0 should be > 0.0", target); +} +if (!(("" + (0 < 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 7: 0 should be < 1.23", target); +} +if (!(("" + (0 === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 8: 0 should be = 1.23", target); +} +if (!(("" + (0 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 9: 0 should be > 1.23", target); +} +if (!(("" + (0 < 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 10: 0 should be < .23", target); +} +if (!(("" + (0 === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 11: 0 should be = .23", target); +} +if (!(("" + (0 > 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 12: 0 should be > .23", target); +} +if (!(("" + (0 < 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 13: 0 should be < 0.123", target); +} +if (!(("" + (0 === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 14: 0 should be = 0.123", target); +} +if (!(("" + (0 > 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 15: 0 should be > 0.123", target); +} +if (!(("" + (0 < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 16: 0 should be < -0", target); +} +if (!(("" + (0 === -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 17: 0 should be = -0", target); +} +if (!(("" + (0 > -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 18: 0 should be > -0", target); +} +if (!(("" + (0 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 19: 0 should be < -1", target); +} +if (!(("" + (0 === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 20: 0 should be = -1", target); +} +if (!(("" + (0 > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 21: 0 should be > -1", target); +} +if (!(("" + ("0".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 22: 0 should be < true", target); +} +if (!(("" + ("0".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 23: 0 should be = true", target); +} +if (!(("" + ("0".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 24: 0 should be > true", target); +} +if (!(("" + ("0".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 25: 0 should be < false", target); +} +if (!(("" + ("0".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 26: 0 should be = false", target); +} +if (!(("" + ("0".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 27: 0 should be > false", target); +} +if (!(("" + ("0".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 28: 0 should be < NaN", target); +} +if (!(("" + ("0".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 29: 0 should be = NaN", target); +} +if (!(("" + ("0".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 30: 0 should be > NaN", target); +} +if (!(("" + (0 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 31: 0 should be < Infinity", target); +} +if (!(("" + (0 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 32: 0 should be = Infinity", target); +} +if (!(("" + (0 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 33: 0 should be > Infinity", target); +} +if (!(("" + ("0".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 34: 0 should be < banana", target); +} +if (!(("" + ("0".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 35: 0 should be = banana", target); +} +if (!(("" + ("0".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 36: 0 should be > banana", target); +} +if (!(("" + ("0".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 37: 0 should be < 🎉", target); +} +if (!(("" + ("0".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 38: 0 should be = 🎉", target); +} +if (!(("" + ("0".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 39: 0 should be > 🎉", target); +} +if (!(("" + ("0".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 40: 0 should be < ", target); +} +if (!(("" + ("0".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 41: 0 should be = ", target); +} +if (!(("" + ("0".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 42: 0 should be > ", target); +} +if (!(("" + (0 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 43: 0.0 should be < 0", target); +} +if (!(("" + (0 === 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 44: 0.0 should be = 0", target); +} +if (!(("" + (0 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 45: 0.0 should be > 0", target); +} +if (!(("" + (0 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 46: 0.0 should be < 0.0", target); +} +if (!(("" + (0 === 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 47: 0.0 should be = 0.0", target); +} +if (!(("" + (0 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 48: 0.0 should be > 0.0", target); +} +if (!(("" + (0 < 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 49: 0.0 should be < 1.23", target); +} +if (!(("" + (0 === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 50: 0.0 should be = 1.23", target); +} +if (!(("" + (0 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 51: 0.0 should be > 1.23", target); +} +if (!(("" + (0 < 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 52: 0.0 should be < .23", target); +} +if (!(("" + (0 === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 53: 0.0 should be = .23", target); +} +if (!(("" + (0 > 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 54: 0.0 should be > .23", target); +} +if (!(("" + (0 < 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 55: 0.0 should be < 0.123", target); +} +if (!(("" + (0 === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 56: 0.0 should be = 0.123", target); +} +if (!(("" + (0 > 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 57: 0.0 should be > 0.123", target); +} +if (!(("" + (0 < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 58: 0.0 should be < -0", target); +} +if (!(("" + (0 === -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 59: 0.0 should be = -0", target); +} +if (!(("" + (0 > -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 60: 0.0 should be > -0", target); +} +if (!(("" + (0 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 61: 0.0 should be < -1", target); +} +if (!(("" + (0 === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 62: 0.0 should be = -1", target); +} +if (!(("" + (0 > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 63: 0.0 should be > -1", target); +} +if (!(("" + ("0.0".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 64: 0.0 should be < true", target); +} +if (!(("" + ("0.0".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 65: 0.0 should be = true", target); +} +if (!(("" + ("0.0".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 66: 0.0 should be > true", target); +} +if (!(("" + ("0.0".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 67: 0.0 should be < false", target); +} +if (!(("" + ("0.0".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 68: 0.0 should be = false", target); +} +if (!(("" + ("0.0".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 69: 0.0 should be > false", target); +} +if (!(("" + ("0.0".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 70: 0.0 should be < NaN", target); +} +if (!(("" + ("0.0".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 71: 0.0 should be = NaN", target); +} +if (!(("" + ("0.0".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 72: 0.0 should be > NaN", target); +} +if (!(("" + (0 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 73: 0.0 should be < Infinity", target); +} +if (!(("" + (0 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 74: 0.0 should be = Infinity", target); +} +if (!(("" + (0 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 75: 0.0 should be > Infinity", target); +} +if (!(("" + ("0.0".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 76: 0.0 should be < banana", target); +} +if (!(("" + ("0.0".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 77: 0.0 should be = banana", target); +} +if (!(("" + ("0.0".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 78: 0.0 should be > banana", target); +} +if (!(("" + ("0.0".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 79: 0.0 should be < 🎉", target); +} +if (!(("" + ("0.0".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 80: 0.0 should be = 🎉", target); +} +if (!(("" + ("0.0".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 81: 0.0 should be > 🎉", target); +} +if (!(("" + ("0.0".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 82: 0.0 should be < ", target); +} +if (!(("" + ("0.0".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 83: 0.0 should be = ", target); +} +if (!(("" + ("0.0".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 84: 0.0 should be > ", target); +} +if (!(("" + (1.23 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 85: 1.23 should be < 0", target); +} +if (!(("" + (1.23 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 86: 1.23 should be = 0", target); +} +if (!(("" + (1.23 > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 87: 1.23 should be > 0", target); +} +if (!(("" + (1.23 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 88: 1.23 should be < 0.0", target); +} +if (!(("" + (1.23 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 89: 1.23 should be = 0.0", target); +} +if (!(("" + (1.23 > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 90: 1.23 should be > 0.0", target); +} +if (!(("" + (1.23 < 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 91: 1.23 should be < 1.23", target); +} +if (!(("" + (1.23 === 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 92: 1.23 should be = 1.23", target); +} +if (!(("" + (1.23 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 93: 1.23 should be > 1.23", target); +} +if (!(("" + (1.23 < 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 94: 1.23 should be < .23", target); +} +if (!(("" + (1.23 === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 95: 1.23 should be = .23", target); +} +if (!(("" + (1.23 > 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 96: 1.23 should be > .23", target); +} +if (!(("" + (1.23 < 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 97: 1.23 should be < 0.123", target); +} +if (!(("" + (1.23 === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 98: 1.23 should be = 0.123", target); +} +if (!(("" + (1.23 > 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 99: 1.23 should be > 0.123", target); +} +if (!(("" + (1.23 < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 100: 1.23 should be < -0", target); +} +if (!(("" + (1.23 === -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 101: 1.23 should be = -0", target); +} +if (!(("" + (1.23 > -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 102: 1.23 should be > -0", target); +} +if (!(("" + (1.23 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 103: 1.23 should be < -1", target); +} +if (!(("" + (1.23 === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 104: 1.23 should be = -1", target); +} +if (!(("" + (1.23 > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 105: 1.23 should be > -1", target); +} +if (!(("" + ("1.23".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 106: 1.23 should be < true", target); +} +if (!(("" + ("1.23".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 107: 1.23 should be = true", target); +} +if (!(("" + ("1.23".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 108: 1.23 should be > true", target); +} +if (!(("" + ("1.23".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 109: 1.23 should be < false", target); +} +if (!(("" + ("1.23".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 110: 1.23 should be = false", target); +} +if (!(("" + ("1.23".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 111: 1.23 should be > false", target); +} +if (!(("" + ("1.23".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 112: 1.23 should be < NaN", target); +} +if (!(("" + ("1.23".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 113: 1.23 should be = NaN", target); +} +if (!(("" + ("1.23".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 114: 1.23 should be > NaN", target); +} +if (!(("" + (1.23 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 115: 1.23 should be < Infinity", target); +} +if (!(("" + (1.23 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 116: 1.23 should be = Infinity", target); +} +if (!(("" + (1.23 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 117: 1.23 should be > Infinity", target); +} +if (!(("" + ("1.23".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 118: 1.23 should be < banana", target); +} +if (!(("" + ("1.23".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 119: 1.23 should be = banana", target); +} +if (!(("" + ("1.23".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 120: 1.23 should be > banana", target); +} +if (!(("" + ("1.23".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 121: 1.23 should be < 🎉", target); +} +if (!(("" + ("1.23".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 122: 1.23 should be = 🎉", target); +} +if (!(("" + ("1.23".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 123: 1.23 should be > 🎉", target); +} +if (!(("" + ("1.23".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 124: 1.23 should be < ", target); +} +if (!(("" + ("1.23".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 125: 1.23 should be = ", target); +} +if (!(("" + ("1.23".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 126: 1.23 should be > ", target); +} +if (!(("" + (0.23 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 127: .23 should be < 0", target); +} +if (!(("" + (0.23 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 128: .23 should be = 0", target); +} +if (!(("" + (0.23 > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 129: .23 should be > 0", target); +} +if (!(("" + (0.23 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 130: .23 should be < 0.0", target); +} +if (!(("" + (0.23 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 131: .23 should be = 0.0", target); +} +if (!(("" + (0.23 > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 132: .23 should be > 0.0", target); +} +if (!(("" + (0.23 < 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 133: .23 should be < 1.23", target); +} +if (!(("" + (0.23 === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 134: .23 should be = 1.23", target); +} +if (!(("" + (0.23 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 135: .23 should be > 1.23", target); +} +if (!(("" + (0.23 < 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 136: .23 should be < .23", target); +} +if (!(("" + (0.23 === 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 137: .23 should be = .23", target); +} +if (!(("" + (0.23 > 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 138: .23 should be > .23", target); +} +if (!(("" + (0.23 < 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 139: .23 should be < 0.123", target); +} +if (!(("" + (0.23 === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 140: .23 should be = 0.123", target); +} +if (!(("" + (0.23 > 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 141: .23 should be > 0.123", target); +} +if (!(("" + (0.23 < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 142: .23 should be < -0", target); +} +if (!(("" + (0.23 === -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 143: .23 should be = -0", target); +} +if (!(("" + (0.23 > -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 144: .23 should be > -0", target); +} +if (!(("" + (0.23 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 145: .23 should be < -1", target); +} +if (!(("" + (0.23 === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 146: .23 should be = -1", target); +} +if (!(("" + (0.23 > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 147: .23 should be > -1", target); +} +if (!(("" + (".23".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 148: .23 should be < true", target); +} +if (!(("" + (".23".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 149: .23 should be = true", target); +} +if (!(("" + (".23".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 150: .23 should be > true", target); +} +if (!(("" + (".23".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 151: .23 should be < false", target); +} +if (!(("" + (".23".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 152: .23 should be = false", target); +} +if (!(("" + (".23".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 153: .23 should be > false", target); +} +if (!(("" + (".23".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 154: .23 should be < NaN", target); +} +if (!(("" + (".23".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 155: .23 should be = NaN", target); +} +if (!(("" + (".23".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 156: .23 should be > NaN", target); +} +if (!(("" + (0.23 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 157: .23 should be < Infinity", target); +} +if (!(("" + (0.23 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 158: .23 should be = Infinity", target); +} +if (!(("" + (0.23 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 159: .23 should be > Infinity", target); +} +if (!(("" + (".23".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 160: .23 should be < banana", target); +} +if (!(("" + (".23".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 161: .23 should be = banana", target); +} +if (!(("" + (".23".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 162: .23 should be > banana", target); +} +if (!(("" + (".23".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 163: .23 should be < 🎉", target); +} +if (!(("" + (".23".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 164: .23 should be = 🎉", target); +} +if (!(("" + (".23".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 165: .23 should be > 🎉", target); +} +if (!(("" + (".23".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 166: .23 should be < ", target); +} +if (!(("" + (".23".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 167: .23 should be = ", target); +} +if (!(("" + (".23".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 168: .23 should be > ", target); +} +if (!(("" + (0.123 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 169: 0.123 should be < 0", target); +} +if (!(("" + (0.123 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 170: 0.123 should be = 0", target); +} +if (!(("" + (0.123 > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 171: 0.123 should be > 0", target); +} +if (!(("" + (0.123 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 172: 0.123 should be < 0.0", target); +} +if (!(("" + (0.123 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 173: 0.123 should be = 0.0", target); +} +if (!(("" + (0.123 > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 174: 0.123 should be > 0.0", target); +} +if (!(("" + (0.123 < 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 175: 0.123 should be < 1.23", target); +} +if (!(("" + (0.123 === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 176: 0.123 should be = 1.23", target); +} +if (!(("" + (0.123 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 177: 0.123 should be > 1.23", target); +} +if (!(("" + (0.123 < 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 178: 0.123 should be < .23", target); +} +if (!(("" + (0.123 === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 179: 0.123 should be = .23", target); +} +if (!(("" + (0.123 > 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 180: 0.123 should be > .23", target); +} +if (!(("" + (0.123 < 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 181: 0.123 should be < 0.123", target); +} +if (!(("" + (0.123 === 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 182: 0.123 should be = 0.123", target); +} +if (!(("" + (0.123 > 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 183: 0.123 should be > 0.123", target); +} +if (!(("" + (0.123 < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 184: 0.123 should be < -0", target); +} +if (!(("" + (0.123 === -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 185: 0.123 should be = -0", target); +} +if (!(("" + (0.123 > -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 186: 0.123 should be > -0", target); +} +if (!(("" + (0.123 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 187: 0.123 should be < -1", target); +} +if (!(("" + (0.123 === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 188: 0.123 should be = -1", target); +} +if (!(("" + (0.123 > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 189: 0.123 should be > -1", target); +} +if (!(("" + ("0.123".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 190: 0.123 should be < true", target); +} +if (!(("" + ("0.123".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 191: 0.123 should be = true", target); +} +if (!(("" + ("0.123".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 192: 0.123 should be > true", target); +} +if (!(("" + ("0.123".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 193: 0.123 should be < false", target); +} +if (!(("" + ("0.123".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 194: 0.123 should be = false", target); +} +if (!(("" + ("0.123".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 195: 0.123 should be > false", target); +} +if (!(("" + ("0.123".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 196: 0.123 should be < NaN", target); +} +if (!(("" + ("0.123".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 197: 0.123 should be = NaN", target); +} +if (!(("" + ("0.123".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 198: 0.123 should be > NaN", target); +} +if (!(("" + (0.123 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 199: 0.123 should be < Infinity", target); +} +if (!(("" + (0.123 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 200: 0.123 should be = Infinity", target); +} +if (!(("" + (0.123 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 201: 0.123 should be > Infinity", target); +} +if (!(("" + ("0.123".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 202: 0.123 should be < banana", target); +} +if (!(("" + ("0.123".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 203: 0.123 should be = banana", target); +} +if (!(("" + ("0.123".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 204: 0.123 should be > banana", target); +} +if (!(("" + ("0.123".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 205: 0.123 should be < 🎉", target); +} +if (!(("" + ("0.123".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 206: 0.123 should be = 🎉", target); +} +if (!(("" + ("0.123".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 207: 0.123 should be > 🎉", target); +} +if (!(("" + ("0.123".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 208: 0.123 should be < ", target); +} +if (!(("" + ("0.123".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 209: 0.123 should be = ", target); +} +if (!(("" + ("0.123".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 210: 0.123 should be > ", target); +} +if (!(("" + (-0 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 211: -0 should be < 0", target); +} +if (!(("" + (-0 === 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 212: -0 should be = 0", target); +} +if (!(("" + (-0 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 213: -0 should be > 0", target); +} +if (!(("" + (-0 < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 214: -0 should be < 0.0", target); +} +if (!(("" + (-0 === 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 215: -0 should be = 0.0", target); +} +if (!(("" + (-0 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 216: -0 should be > 0.0", target); +} +if (!(("" + (-0 < 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 217: -0 should be < 1.23", target); +} +if (!(("" + (-0 === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 218: -0 should be = 1.23", target); +} +if (!(("" + (-0 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 219: -0 should be > 1.23", target); +} +if (!(("" + (-0 < 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 220: -0 should be < .23", target); +} +if (!(("" + (-0 === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 221: -0 should be = .23", target); +} +if (!(("" + (-0 > 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 222: -0 should be > .23", target); +} +if (!(("" + (-0 < 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 223: -0 should be < 0.123", target); +} +if (!(("" + (-0 === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 224: -0 should be = 0.123", target); +} +if (!(("" + (-0 > 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 225: -0 should be > 0.123", target); +} +if (!(("" + (-0 < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 226: -0 should be < -0", target); +} +if (!(("" + (-0 === -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 227: -0 should be = -0", target); +} +if (!(("" + (-0 > -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 228: -0 should be > -0", target); +} +if (!(("" + (-0 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 229: -0 should be < -1", target); +} +if (!(("" + (-0 === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 230: -0 should be = -1", target); +} +if (!(("" + (-0 > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 231: -0 should be > -1", target); +} +if (!(("" + ("-0".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 232: -0 should be < true", target); +} +if (!(("" + ("-0".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 233: -0 should be = true", target); +} +if (!(("" + ("-0".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 234: -0 should be > true", target); +} +if (!(("" + ("-0".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 235: -0 should be < false", target); +} +if (!(("" + ("-0".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 236: -0 should be = false", target); +} +if (!(("" + ("-0".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 237: -0 should be > false", target); +} +if (!(("" + ("-0".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 238: -0 should be < NaN", target); +} +if (!(("" + ("-0".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 239: -0 should be = NaN", target); +} +if (!(("" + ("-0".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 240: -0 should be > NaN", target); +} +if (!(("" + (-0 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 241: -0 should be < Infinity", target); +} +if (!(("" + (-0 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 242: -0 should be = Infinity", target); +} +if (!(("" + (-0 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 243: -0 should be > Infinity", target); +} +if (!(("" + ("-0".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 244: -0 should be < banana", target); +} +if (!(("" + ("-0".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 245: -0 should be = banana", target); +} +if (!(("" + ("-0".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 246: -0 should be > banana", target); +} +if (!(("" + ("-0".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 247: -0 should be < 🎉", target); +} +if (!(("" + ("-0".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 248: -0 should be = 🎉", target); +} +if (!(("" + ("-0".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 249: -0 should be > 🎉", target); +} +if (!(("" + ("-0".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 250: -0 should be < ", target); +} +if (!(("" + ("-0".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 251: -0 should be = ", target); +} +if (!(("" + ("-0".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 252: -0 should be > ", target); +} +if (!(("" + (-1 < 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 253: -1 should be < 0", target); +} +if (!(("" + (-1 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 254: -1 should be = 0", target); +} +if (!(("" + (-1 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 255: -1 should be > 0", target); +} +if (!(("" + (-1 < 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 256: -1 should be < 0.0", target); +} +if (!(("" + (-1 === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 257: -1 should be = 0.0", target); +} +if (!(("" + (-1 > 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 258: -1 should be > 0.0", target); +} +if (!(("" + (-1 < 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 259: -1 should be < 1.23", target); +} +if (!(("" + (-1 === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 260: -1 should be = 1.23", target); +} +if (!(("" + (-1 > 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 261: -1 should be > 1.23", target); +} +if (!(("" + (-1 < 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 262: -1 should be < .23", target); +} +if (!(("" + (-1 === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 263: -1 should be = .23", target); +} +if (!(("" + (-1 > 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 264: -1 should be > .23", target); +} +if (!(("" + (-1 < 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 265: -1 should be < 0.123", target); +} +if (!(("" + (-1 === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 266: -1 should be = 0.123", target); +} +if (!(("" + (-1 > 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 267: -1 should be > 0.123", target); +} +if (!(("" + (-1 < -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 268: -1 should be < -0", target); +} +if (!(("" + (-1 === -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 269: -1 should be = -0", target); +} +if (!(("" + (-1 > -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 270: -1 should be > -0", target); +} +if (!(("" + (-1 < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 271: -1 should be < -1", target); +} +if (!(("" + (-1 === -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 272: -1 should be = -1", target); +} +if (!(("" + (-1 > -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 273: -1 should be > -1", target); +} +if (!(("" + ("-1".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 274: -1 should be < true", target); +} +if (!(("" + ("-1".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 275: -1 should be = true", target); +} +if (!(("" + ("-1".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 276: -1 should be > true", target); +} +if (!(("" + ("-1".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 277: -1 should be < false", target); +} +if (!(("" + ("-1".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 278: -1 should be = false", target); +} +if (!(("" + ("-1".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 279: -1 should be > false", target); +} +if (!(("" + ("-1".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 280: -1 should be < NaN", target); +} +if (!(("" + ("-1".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 281: -1 should be = NaN", target); +} +if (!(("" + ("-1".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 282: -1 should be > NaN", target); +} +if (!(("" + (-1 < Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 283: -1 should be < Infinity", target); +} +if (!(("" + (-1 === Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 284: -1 should be = Infinity", target); +} +if (!(("" + (-1 > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 285: -1 should be > Infinity", target); +} +if (!(("" + ("-1".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 286: -1 should be < banana", target); +} +if (!(("" + ("-1".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 287: -1 should be = banana", target); +} +if (!(("" + ("-1".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 288: -1 should be > banana", target); +} +if (!(("" + ("-1".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 289: -1 should be < 🎉", target); +} +if (!(("" + ("-1".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 290: -1 should be = 🎉", target); +} +if (!(("" + ("-1".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 291: -1 should be > 🎉", target); +} +if (!(("" + ("-1".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 292: -1 should be < ", target); +} +if (!(("" + ("-1".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 293: -1 should be = ", target); +} +if (!(("" + ("-1".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 294: -1 should be > ", target); +} +if (!(("" + ("true".toLowerCase() < "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 295: true should be < 0", target); +} +if (!(("" + ("true".toLowerCase() === "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 296: true should be = 0", target); +} +if (!(("" + ("true".toLowerCase() > "0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 297: true should be > 0", target); +} +if (!(("" + ("true".toLowerCase() < "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 298: true should be < 0.0", target); +} +if (!(("" + ("true".toLowerCase() === "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 299: true should be = 0.0", target); +} +if (!(("" + ("true".toLowerCase() > "0.0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 300: true should be > 0.0", target); +} +if (!(("" + ("true".toLowerCase() < "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 301: true should be < 1.23", target); +} +if (!(("" + ("true".toLowerCase() === "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 302: true should be = 1.23", target); +} +if (!(("" + ("true".toLowerCase() > "1.23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 303: true should be > 1.23", target); +} +if (!(("" + ("true".toLowerCase() < ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 304: true should be < .23", target); +} +if (!(("" + ("true".toLowerCase() === ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 305: true should be = .23", target); +} +if (!(("" + ("true".toLowerCase() > ".23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 306: true should be > .23", target); +} +if (!(("" + ("true".toLowerCase() < "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 307: true should be < 0.123", target); +} +if (!(("" + ("true".toLowerCase() === "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 308: true should be = 0.123", target); +} +if (!(("" + ("true".toLowerCase() > "0.123".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 309: true should be > 0.123", target); +} +if (!(("" + ("true".toLowerCase() < "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 310: true should be < -0", target); +} +if (!(("" + ("true".toLowerCase() === "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 311: true should be = -0", target); +} +if (!(("" + ("true".toLowerCase() > "-0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 312: true should be > -0", target); +} +if (!(("" + ("true".toLowerCase() < "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 313: true should be < -1", target); +} +if (!(("" + ("true".toLowerCase() === "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 314: true should be = -1", target); +} +if (!(("" + ("true".toLowerCase() > "-1".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 315: true should be > -1", target); +} +if (!(("" + ("true".toLowerCase() < "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 316: true should be < true", target); +} +if (!(("" + ("true".toLowerCase() === "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 317: true should be = true", target); +} +if (!(("" + ("true".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 318: true should be > true", target); +} +if (!(("" + ("true".toLowerCase() < "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 319: true should be < false", target); +} +if (!(("" + ("true".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 320: true should be = false", target); +} +if (!(("" + ("true".toLowerCase() > "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 321: true should be > false", target); +} +if (!(("" + ("true".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 322: true should be < NaN", target); +} +if (!(("" + ("true".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 323: true should be = NaN", target); +} +if (!(("" + ("true".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 324: true should be > NaN", target); +} +if (!(("" + ("true".toLowerCase() < "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 325: true should be < Infinity", target); +} +if (!(("" + ("true".toLowerCase() === "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 326: true should be = Infinity", target); +} +if (!(("" + ("true".toLowerCase() > "Infinity".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 327: true should be > Infinity", target); +} +if (!(("" + ("true".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 328: true should be < banana", target); +} +if (!(("" + ("true".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 329: true should be = banana", target); +} +if (!(("" + ("true".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 330: true should be > banana", target); +} +if (!(("" + ("true".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 331: true should be < 🎉", target); +} +if (!(("" + ("true".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 332: true should be = 🎉", target); +} +if (!(("" + ("true".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 333: true should be > 🎉", target); +} +if (!(("" + ("true".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 334: true should be < ", target); +} +if (!(("" + ("true".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 335: true should be = ", target); +} +if (!(("" + ("true".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 336: true should be > ", target); +} +if (!(("" + ("false".toLowerCase() < "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 337: false should be < 0", target); +} +if (!(("" + ("false".toLowerCase() === "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 338: false should be = 0", target); +} +if (!(("" + ("false".toLowerCase() > "0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 339: false should be > 0", target); +} +if (!(("" + ("false".toLowerCase() < "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 340: false should be < 0.0", target); +} +if (!(("" + ("false".toLowerCase() === "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 341: false should be = 0.0", target); +} +if (!(("" + ("false".toLowerCase() > "0.0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 342: false should be > 0.0", target); +} +if (!(("" + ("false".toLowerCase() < "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 343: false should be < 1.23", target); +} +if (!(("" + ("false".toLowerCase() === "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 344: false should be = 1.23", target); +} +if (!(("" + ("false".toLowerCase() > "1.23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 345: false should be > 1.23", target); +} +if (!(("" + ("false".toLowerCase() < ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 346: false should be < .23", target); +} +if (!(("" + ("false".toLowerCase() === ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 347: false should be = .23", target); +} +if (!(("" + ("false".toLowerCase() > ".23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 348: false should be > .23", target); +} +if (!(("" + ("false".toLowerCase() < "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 349: false should be < 0.123", target); +} +if (!(("" + ("false".toLowerCase() === "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 350: false should be = 0.123", target); +} +if (!(("" + ("false".toLowerCase() > "0.123".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 351: false should be > 0.123", target); +} +if (!(("" + ("false".toLowerCase() < "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 352: false should be < -0", target); +} +if (!(("" + ("false".toLowerCase() === "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 353: false should be = -0", target); +} +if (!(("" + ("false".toLowerCase() > "-0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 354: false should be > -0", target); +} +if (!(("" + ("false".toLowerCase() < "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 355: false should be < -1", target); +} +if (!(("" + ("false".toLowerCase() === "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 356: false should be = -1", target); +} +if (!(("" + ("false".toLowerCase() > "-1".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 357: false should be > -1", target); +} +if (!(("" + ("false".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 358: false should be < true", target); +} +if (!(("" + ("false".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 359: false should be = true", target); +} +if (!(("" + ("false".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 360: false should be > true", target); +} +if (!(("" + ("false".toLowerCase() < "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 361: false should be < false", target); +} +if (!(("" + ("false".toLowerCase() === "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 362: false should be = false", target); +} +if (!(("" + ("false".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 363: false should be > false", target); +} +if (!(("" + ("false".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 364: false should be < NaN", target); +} +if (!(("" + ("false".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 365: false should be = NaN", target); +} +if (!(("" + ("false".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 366: false should be > NaN", target); +} +if (!(("" + ("false".toLowerCase() < "Infinity".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 367: false should be < Infinity", target); +} +if (!(("" + ("false".toLowerCase() === "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 368: false should be = Infinity", target); +} +if (!(("" + ("false".toLowerCase() > "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 369: false should be > Infinity", target); +} +if (!(("" + ("false".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 370: false should be < banana", target); +} +if (!(("" + ("false".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 371: false should be = banana", target); +} +if (!(("" + ("false".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 372: false should be > banana", target); +} +if (!(("" + ("false".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 373: false should be < 🎉", target); +} +if (!(("" + ("false".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 374: false should be = 🎉", target); +} +if (!(("" + ("false".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 375: false should be > 🎉", target); +} +if (!(("" + ("false".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 376: false should be < ", target); +} +if (!(("" + ("false".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 377: false should be = ", target); +} +if (!(("" + ("false".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 378: false should be > ", target); +} +if (!(("" + ("NaN".toLowerCase() < "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 379: NaN should be < 0", target); +} +if (!(("" + ("NaN".toLowerCase() === "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 380: NaN should be = 0", target); +} +if (!(("" + ("NaN".toLowerCase() > "0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 381: NaN should be > 0", target); +} +if (!(("" + ("NaN".toLowerCase() < "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 382: NaN should be < 0.0", target); +} +if (!(("" + ("NaN".toLowerCase() === "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 383: NaN should be = 0.0", target); +} +if (!(("" + ("NaN".toLowerCase() > "0.0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 384: NaN should be > 0.0", target); +} +if (!(("" + ("NaN".toLowerCase() < "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 385: NaN should be < 1.23", target); +} +if (!(("" + ("NaN".toLowerCase() === "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 386: NaN should be = 1.23", target); +} +if (!(("" + ("NaN".toLowerCase() > "1.23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 387: NaN should be > 1.23", target); +} +if (!(("" + ("NaN".toLowerCase() < ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 388: NaN should be < .23", target); +} +if (!(("" + ("NaN".toLowerCase() === ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 389: NaN should be = .23", target); +} +if (!(("" + ("NaN".toLowerCase() > ".23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 390: NaN should be > .23", target); +} +if (!(("" + ("NaN".toLowerCase() < "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 391: NaN should be < 0.123", target); +} +if (!(("" + ("NaN".toLowerCase() === "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 392: NaN should be = 0.123", target); +} +if (!(("" + ("NaN".toLowerCase() > "0.123".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 393: NaN should be > 0.123", target); +} +if (!(("" + ("NaN".toLowerCase() < "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 394: NaN should be < -0", target); +} +if (!(("" + ("NaN".toLowerCase() === "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 395: NaN should be = -0", target); +} +if (!(("" + ("NaN".toLowerCase() > "-0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 396: NaN should be > -0", target); +} +if (!(("" + ("NaN".toLowerCase() < "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 397: NaN should be < -1", target); +} +if (!(("" + ("NaN".toLowerCase() === "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 398: NaN should be = -1", target); +} +if (!(("" + ("NaN".toLowerCase() > "-1".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 399: NaN should be > -1", target); +} +if (!(("" + ("NaN".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 400: NaN should be < true", target); +} +if (!(("" + ("NaN".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 401: NaN should be = true", target); +} +if (!(("" + ("NaN".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 402: NaN should be > true", target); +} +if (!(("" + ("NaN".toLowerCase() < "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 403: NaN should be < false", target); +} +if (!(("" + ("NaN".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 404: NaN should be = false", target); +} +if (!(("" + ("NaN".toLowerCase() > "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 405: NaN should be > false", target); +} +if (!(("" + ("NaN".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 406: NaN should be < NaN", target); +} +if (!(("" + ("NaN".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 407: NaN should be = NaN", target); +} +if (!(("" + ("NaN".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 408: NaN should be > NaN", target); +} +if (!(("" + ("NaN".toLowerCase() < "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 409: NaN should be < Infinity", target); +} +if (!(("" + ("NaN".toLowerCase() === "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 410: NaN should be = Infinity", target); +} +if (!(("" + ("NaN".toLowerCase() > "Infinity".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 411: NaN should be > Infinity", target); +} +if (!(("" + ("NaN".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 412: NaN should be < banana", target); +} +if (!(("" + ("NaN".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 413: NaN should be = banana", target); +} +if (!(("" + ("NaN".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 414: NaN should be > banana", target); +} +if (!(("" + ("NaN".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 415: NaN should be < 🎉", target); +} +if (!(("" + ("NaN".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 416: NaN should be = 🎉", target); +} +if (!(("" + ("NaN".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 417: NaN should be > 🎉", target); +} +if (!(("" + ("NaN".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 418: NaN should be < ", target); +} +if (!(("" + ("NaN".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 419: NaN should be = ", target); +} +if (!(("" + ("NaN".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 420: NaN should be > ", target); +} +if (!(("" + (Infinity < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 421: Infinity should be < 0", target); +} +if (!(("" + (Infinity === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 422: Infinity should be = 0", target); +} +if (!(("" + (Infinity > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 423: Infinity should be > 0", target); +} +if (!(("" + (Infinity < 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 424: Infinity should be < 0.0", target); +} +if (!(("" + (Infinity === 0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 425: Infinity should be = 0.0", target); +} +if (!(("" + (Infinity > 0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 426: Infinity should be > 0.0", target); +} +if (!(("" + (Infinity < 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 427: Infinity should be < 1.23", target); +} +if (!(("" + (Infinity === 1.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 428: Infinity should be = 1.23", target); +} +if (!(("" + (Infinity > 1.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 429: Infinity should be > 1.23", target); +} +if (!(("" + (Infinity < 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 430: Infinity should be < .23", target); +} +if (!(("" + (Infinity === 0.23)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 431: Infinity should be = .23", target); +} +if (!(("" + (Infinity > 0.23)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 432: Infinity should be > .23", target); +} +if (!(("" + (Infinity < 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 433: Infinity should be < 0.123", target); +} +if (!(("" + (Infinity === 0.123)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 434: Infinity should be = 0.123", target); +} +if (!(("" + (Infinity > 0.123)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 435: Infinity should be > 0.123", target); +} +if (!(("" + (Infinity < -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 436: Infinity should be < -0", target); +} +if (!(("" + (Infinity === -0)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 437: Infinity should be = -0", target); +} +if (!(("" + (Infinity > -0)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 438: Infinity should be > -0", target); +} +if (!(("" + (Infinity < -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 439: Infinity should be < -1", target); +} +if (!(("" + (Infinity === -1)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 440: Infinity should be = -1", target); +} +if (!(("" + (Infinity > -1)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 441: Infinity should be > -1", target); +} +if (!(("" + ("Infinity".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 442: Infinity should be < true", target); +} +if (!(("" + ("Infinity".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 443: Infinity should be = true", target); +} +if (!(("" + ("Infinity".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 444: Infinity should be > true", target); +} +if (!(("" + ("Infinity".toLowerCase() < "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 445: Infinity should be < false", target); +} +if (!(("" + ("Infinity".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 446: Infinity should be = false", target); +} +if (!(("" + ("Infinity".toLowerCase() > "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 447: Infinity should be > false", target); +} +if (!(("" + ("Infinity".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 448: Infinity should be < NaN", target); +} +if (!(("" + ("Infinity".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 449: Infinity should be = NaN", target); +} +if (!(("" + ("Infinity".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 450: Infinity should be > NaN", target); +} +if (!(("" + (Infinity < Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 451: Infinity should be < Infinity", target); +} +if (!(("" + (Infinity === Infinity)).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 452: Infinity should be = Infinity", target); +} +if (!(("" + (Infinity > Infinity)).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 453: Infinity should be > Infinity", target); +} +if (!(("" + ("Infinity".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 454: Infinity should be < banana", target); +} +if (!(("" + ("Infinity".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 455: Infinity should be = banana", target); +} +if (!(("" + ("Infinity".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 456: Infinity should be > banana", target); +} +if (!(("" + ("Infinity".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 457: Infinity should be < 🎉", target); +} +if (!(("" + ("Infinity".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 458: Infinity should be = 🎉", target); +} +if (!(("" + ("Infinity".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 459: Infinity should be > 🎉", target); +} +if (!(("" + ("Infinity".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 460: Infinity should be < ", target); +} +if (!(("" + ("Infinity".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 461: Infinity should be = ", target); +} +if (!(("" + ("Infinity".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 462: Infinity should be > ", target); +} +if (!(("" + ("banana".toLowerCase() < "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 463: banana should be < 0", target); +} +if (!(("" + ("banana".toLowerCase() === "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 464: banana should be = 0", target); +} +if (!(("" + ("banana".toLowerCase() > "0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 465: banana should be > 0", target); +} +if (!(("" + ("banana".toLowerCase() < "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 466: banana should be < 0.0", target); +} +if (!(("" + ("banana".toLowerCase() === "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 467: banana should be = 0.0", target); +} +if (!(("" + ("banana".toLowerCase() > "0.0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 468: banana should be > 0.0", target); +} +if (!(("" + ("banana".toLowerCase() < "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 469: banana should be < 1.23", target); +} +if (!(("" + ("banana".toLowerCase() === "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 470: banana should be = 1.23", target); +} +if (!(("" + ("banana".toLowerCase() > "1.23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 471: banana should be > 1.23", target); +} +if (!(("" + ("banana".toLowerCase() < ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 472: banana should be < .23", target); +} +if (!(("" + ("banana".toLowerCase() === ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 473: banana should be = .23", target); +} +if (!(("" + ("banana".toLowerCase() > ".23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 474: banana should be > .23", target); +} +if (!(("" + ("banana".toLowerCase() < "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 475: banana should be < 0.123", target); +} +if (!(("" + ("banana".toLowerCase() === "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 476: banana should be = 0.123", target); +} +if (!(("" + ("banana".toLowerCase() > "0.123".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 477: banana should be > 0.123", target); +} +if (!(("" + ("banana".toLowerCase() < "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 478: banana should be < -0", target); +} +if (!(("" + ("banana".toLowerCase() === "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 479: banana should be = -0", target); +} +if (!(("" + ("banana".toLowerCase() > "-0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 480: banana should be > -0", target); +} +if (!(("" + ("banana".toLowerCase() < "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 481: banana should be < -1", target); +} +if (!(("" + ("banana".toLowerCase() === "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 482: banana should be = -1", target); +} +if (!(("" + ("banana".toLowerCase() > "-1".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 483: banana should be > -1", target); +} +if (!(("" + ("banana".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 484: banana should be < true", target); +} +if (!(("" + ("banana".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 485: banana should be = true", target); +} +if (!(("" + ("banana".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 486: banana should be > true", target); +} +if (!(("" + ("banana".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 487: banana should be < false", target); +} +if (!(("" + ("banana".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 488: banana should be = false", target); +} +if (!(("" + ("banana".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 489: banana should be > false", target); +} +if (!(("" + ("banana".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 490: banana should be < NaN", target); +} +if (!(("" + ("banana".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 491: banana should be = NaN", target); +} +if (!(("" + ("banana".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 492: banana should be > NaN", target); +} +if (!(("" + ("banana".toLowerCase() < "Infinity".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 493: banana should be < Infinity", target); +} +if (!(("" + ("banana".toLowerCase() === "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 494: banana should be = Infinity", target); +} +if (!(("" + ("banana".toLowerCase() > "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 495: banana should be > Infinity", target); +} +if (!(("" + ("banana".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 496: banana should be < banana", target); +} +if (!(("" + ("banana".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 497: banana should be = banana", target); +} +if (!(("" + ("banana".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 498: banana should be > banana", target); +} +if (!(("" + ("banana".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 499: banana should be < 🎉", target); +} +if (!(("" + ("banana".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 500: banana should be = 🎉", target); +} +if (!(("" + ("banana".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 501: banana should be > 🎉", target); +} +if (!(("" + ("banana".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 502: banana should be < ", target); +} +if (!(("" + ("banana".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 503: banana should be = ", target); +} +if (!(("" + ("banana".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 504: banana should be > ", target); +} +if (!(("" + ("🎉".toLowerCase() < "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 505: 🎉 should be < 0", target); +} +if (!(("" + ("🎉".toLowerCase() === "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 506: 🎉 should be = 0", target); +} +if (!(("" + ("🎉".toLowerCase() > "0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 507: 🎉 should be > 0", target); +} +if (!(("" + ("🎉".toLowerCase() < "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 508: 🎉 should be < 0.0", target); +} +if (!(("" + ("🎉".toLowerCase() === "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 509: 🎉 should be = 0.0", target); +} +if (!(("" + ("🎉".toLowerCase() > "0.0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 510: 🎉 should be > 0.0", target); +} +if (!(("" + ("🎉".toLowerCase() < "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 511: 🎉 should be < 1.23", target); +} +if (!(("" + ("🎉".toLowerCase() === "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 512: 🎉 should be = 1.23", target); +} +if (!(("" + ("🎉".toLowerCase() > "1.23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 513: 🎉 should be > 1.23", target); +} +if (!(("" + ("🎉".toLowerCase() < ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 514: 🎉 should be < .23", target); +} +if (!(("" + ("🎉".toLowerCase() === ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 515: 🎉 should be = .23", target); +} +if (!(("" + ("🎉".toLowerCase() > ".23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 516: 🎉 should be > .23", target); +} +if (!(("" + ("🎉".toLowerCase() < "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 517: 🎉 should be < 0.123", target); +} +if (!(("" + ("🎉".toLowerCase() === "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 518: 🎉 should be = 0.123", target); +} +if (!(("" + ("🎉".toLowerCase() > "0.123".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 519: 🎉 should be > 0.123", target); +} +if (!(("" + ("🎉".toLowerCase() < "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 520: 🎉 should be < -0", target); +} +if (!(("" + ("🎉".toLowerCase() === "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 521: 🎉 should be = -0", target); +} +if (!(("" + ("🎉".toLowerCase() > "-0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 522: 🎉 should be > -0", target); +} +if (!(("" + ("🎉".toLowerCase() < "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 523: 🎉 should be < -1", target); +} +if (!(("" + ("🎉".toLowerCase() === "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 524: 🎉 should be = -1", target); +} +if (!(("" + ("🎉".toLowerCase() > "-1".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 525: 🎉 should be > -1", target); +} +if (!(("" + ("🎉".toLowerCase() < "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 526: 🎉 should be < true", target); +} +if (!(("" + ("🎉".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 527: 🎉 should be = true", target); +} +if (!(("" + ("🎉".toLowerCase() > "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 528: 🎉 should be > true", target); +} +if (!(("" + ("🎉".toLowerCase() < "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 529: 🎉 should be < false", target); +} +if (!(("" + ("🎉".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 530: 🎉 should be = false", target); +} +if (!(("" + ("🎉".toLowerCase() > "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 531: 🎉 should be > false", target); +} +if (!(("" + ("🎉".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 532: 🎉 should be < NaN", target); +} +if (!(("" + ("🎉".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 533: 🎉 should be = NaN", target); +} +if (!(("" + ("🎉".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 534: 🎉 should be > NaN", target); +} +if (!(("" + ("🎉".toLowerCase() < "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 535: 🎉 should be < Infinity", target); +} +if (!(("" + ("🎉".toLowerCase() === "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 536: 🎉 should be = Infinity", target); +} +if (!(("" + ("🎉".toLowerCase() > "Infinity".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 537: 🎉 should be > Infinity", target); +} +if (!(("" + ("🎉".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 538: 🎉 should be < banana", target); +} +if (!(("" + ("🎉".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 539: 🎉 should be = banana", target); +} +if (!(("" + ("🎉".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 540: 🎉 should be > banana", target); +} +if (!(("" + ("🎉".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 541: 🎉 should be < 🎉", target); +} +if (!(("" + ("🎉".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 542: 🎉 should be = 🎉", target); +} +if (!(("" + ("🎉".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 543: 🎉 should be > 🎉", target); +} +if (!(("" + ("🎉".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 544: 🎉 should be < ", target); +} +if (!(("" + ("🎉".toLowerCase() === "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 545: 🎉 should be = ", target); +} +if (!(("" + ("🎉".toLowerCase() > "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 546: 🎉 should be > ", target); +} +if (!(("" + ("".toLowerCase() < "0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 547: should be < 0", target); +} +if (!(("" + ("".toLowerCase() === "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 548: should be = 0", target); +} +if (!(("" + ("".toLowerCase() > "0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 549: should be > 0", target); +} +if (!(("" + ("".toLowerCase() < "0.0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 550: should be < 0.0", target); +} +if (!(("" + ("".toLowerCase() === "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 551: should be = 0.0", target); +} +if (!(("" + ("".toLowerCase() > "0.0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 552: should be > 0.0", target); +} +if (!(("" + ("".toLowerCase() < "1.23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 553: should be < 1.23", target); +} +if (!(("" + ("".toLowerCase() === "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 554: should be = 1.23", target); +} +if (!(("" + ("".toLowerCase() > "1.23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 555: should be > 1.23", target); +} +if (!(("" + ("".toLowerCase() < ".23".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 556: should be < .23", target); +} +if (!(("" + ("".toLowerCase() === ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 557: should be = .23", target); +} +if (!(("" + ("".toLowerCase() > ".23".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 558: should be > .23", target); +} +if (!(("" + ("".toLowerCase() < "0.123".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 559: should be < 0.123", target); +} +if (!(("" + ("".toLowerCase() === "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 560: should be = 0.123", target); +} +if (!(("" + ("".toLowerCase() > "0.123".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 561: should be > 0.123", target); +} +if (!(("" + ("".toLowerCase() < "-0".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 562: should be < -0", target); +} +if (!(("" + ("".toLowerCase() === "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 563: should be = -0", target); +} +if (!(("" + ("".toLowerCase() > "-0".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 564: should be > -0", target); +} +if (!(("" + ("".toLowerCase() < "-1".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 565: should be < -1", target); +} +if (!(("" + ("".toLowerCase() === "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 566: should be = -1", target); +} +if (!(("" + ("".toLowerCase() > "-1".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 567: should be > -1", target); +} +if (!(("" + ("".toLowerCase() < "true".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 568: should be < true", target); +} +if (!(("" + ("".toLowerCase() === "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 569: should be = true", target); +} +if (!(("" + ("".toLowerCase() > "true".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 570: should be > true", target); +} +if (!(("" + ("".toLowerCase() < "false".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 571: should be < false", target); +} +if (!(("" + ("".toLowerCase() === "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 572: should be = false", target); +} +if (!(("" + ("".toLowerCase() > "false".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 573: should be > false", target); +} +if (!(("" + ("".toLowerCase() < "NaN".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 574: should be < NaN", target); +} +if (!(("" + ("".toLowerCase() === "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 575: should be = NaN", target); +} +if (!(("" + ("".toLowerCase() > "NaN".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 576: should be > NaN", target); +} +if (!(("" + ("".toLowerCase() < "Infinity".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 577: should be < Infinity", target); +} +if (!(("" + ("".toLowerCase() === "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 578: should be = Infinity", target); +} +if (!(("" + ("".toLowerCase() > "Infinity".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 579: should be > Infinity", target); +} +if (!(("" + ("".toLowerCase() < "banana".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 580: should be < banana", target); +} +if (!(("" + ("".toLowerCase() === "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 581: should be = banana", target); +} +if (!(("" + ("".toLowerCase() > "banana".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 582: should be > banana", target); +} +if (!(("" + ("".toLowerCase() < "🎉".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 583: should be < 🎉", target); +} +if (!(("" + ("".toLowerCase() === "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 584: should be = 🎉", target); +} +if (!(("" + ("".toLowerCase() > "🎉".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 585: should be > 🎉", target); +} +if (!(("" + ("".toLowerCase() < "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 586: should be < ", target); +} +if (!(("" + ("".toLowerCase() === "".toLowerCase())).toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 587: should be = ", target); +} +if (!(("" + ("".toLowerCase() > "".toLowerCase())).toLowerCase() === "false".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail 588: should be > ", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-comparison-matrix-runtime.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-comparison-matrix-runtime.sb3.tw-snapshot index 02cbe0071e9..bccafbe8d5f 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-comparison-matrix-runtime.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-comparison-matrix-runtime.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 698b7a46d7ae7b0ea802888a6515a629f9a13721cae399629902031b0aa9c633 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 0", target); yield* thread.procedures["Wrun test"](); @@ -14,10 +11,7 @@ retire(); return; }; }) // Sprite1 Wrun test -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["mfV;yS}9e:%h5UZ)QyiY"]; const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; const b2 = stage.variables["n^wm8jw#b24sggt.S^tD"]; @@ -27,22 +21,22 @@ return function* genXYZ_run_test () { thread.procedures["Wsetup values"](); b0.value = 0; b1.value = 0; -for (var a0 = b2.value.length; a0 >= 0.5; a0--) { +for (var a0 = b2.value.length; a0 > 0; a0--) { b1.value = (toNotNaN(+b1.value) + 1); b3.value = 0; -for (var a1 = b2.value.length; a1 >= 0.5; a1--) { +for (var a1 = b2.value.length; a1 > 0; a1--) { b3.value = (toNotNaN(+b3.value) + 1); b0.value = (toNotNaN(+b0.value) + 1); if (!compareEqual(compareGreaterThan(listGet(b2.value, b1.value), (b2.value[(b3.value | 0) - 1] ?? "")), (b4.value[(b0.value | 0) - 1] ?? ""))) { -runtime.ext_scratch3_looks._say(("fail " + (("" + listGet(b2.value, b1.value)) + (" should be > " + ("" + listGet(b2.value, b3.value))))), target); +runtime.ext_scratch3_looks._say(("fail " + (("" + listGet(b2.value, b1.value)) + (" should be > " + ("" + (b2.value[(b3.value | 0) - 1] ?? ""))))), target); } b0.value = (b0.value + 1); -if (!compareEqual(compareEqual(listGet(b2.value, b1.value), listGet(b2.value, b3.value)), (b4.value[(b0.value | 0) - 1] ?? ""))) { -runtime.ext_scratch3_looks._say(("fail " + (("" + listGet(b2.value, b1.value)) + (" should be = " + ("" + listGet(b2.value, b3.value))))), target); +if (!compareEqual(compareEqual(listGet(b2.value, b1.value), (b2.value[(b3.value | 0) - 1] ?? "")), (b4.value[(b0.value | 0) - 1] ?? ""))) { +runtime.ext_scratch3_looks._say(("fail " + (("" + listGet(b2.value, b1.value)) + (" should be = " + ("" + (b2.value[(b3.value | 0) - 1] ?? ""))))), target); } b0.value = (b0.value + 1); -if (!compareEqual(compareLessThan(listGet(b2.value, b1.value), listGet(b2.value, b3.value)), (b4.value[(b0.value | 0) - 1] ?? ""))) { -runtime.ext_scratch3_looks._say(("fail " + (("" + listGet(b2.value, b1.value)) + (" should be < " + ("" + listGet(b2.value, b3.value))))), target); +if (!compareEqual(compareLessThan(listGet(b2.value, b1.value), (b2.value[(b3.value | 0) - 1] ?? "")), (b4.value[(b0.value | 0) - 1] ?? ""))) { +runtime.ext_scratch3_looks._say(("fail " + (("" + listGet(b2.value, b1.value)) + (" should be < " + ("" + (b2.value[(b3.value | 0) - 1] ?? ""))))), target); } if (isStuck()) yield; } @@ -52,50 +46,84 @@ return ""; }; }) // Sprite1 Wsetup values -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["n^wm8jw#b24sggt.S^tD"]; return function funXYZ_setup_values () { b0.value = []; b0.value.push(0); +b0._monitorUpToDate = false; b0.value.push(1); +b0._monitorUpToDate = false; b0.value.push(2); +b0._monitorUpToDate = false; b0.value.push(-1); +b0._monitorUpToDate = false; b0.value.push(-2); +b0._monitorUpToDate = false; b0.value.push("0.0"); +b0._monitorUpToDate = false; b0.value.push("-0."); +b0._monitorUpToDate = false; b0.value.push("-0.0"); +b0._monitorUpToDate = false; b0.value.push(".123"); +b0._monitorUpToDate = false; b0.value.push("-.123"); +b0._monitorUpToDate = false; b0.value.push("1."); -b0.value.push(0); -b0.value.push(1); -b0.value.push(2); -b0.value.push(-1); -b0.value.push(-2); -b0.value.push(0.123); -b0.value.push(-0.123); -b0.value.push(1); +b0._monitorUpToDate = false; +b0.value.push((0 + 0)); +b0._monitorUpToDate = false; +b0.value.push((1 + 0)); +b0._monitorUpToDate = false; +b0.value.push((2 + 0)); +b0._monitorUpToDate = false; +b0.value.push((-1 + 0)); +b0._monitorUpToDate = false; +b0.value.push((-2 + 0)); +b0._monitorUpToDate = false; +b0.value.push((0.123 + 0)); +b0._monitorUpToDate = false; +b0.value.push((-0.123 + 0)); +b0._monitorUpToDate = false; +b0.value.push((1 + 0)); +b0._monitorUpToDate = false; b0.value.push("1e99"); -b0.value.push(1e+99); +b0._monitorUpToDate = false; +b0.value.push((1e+99 + 0)); +b0._monitorUpToDate = false; b0.value.push(Infinity); +b0._monitorUpToDate = false; b0.value.push(-Infinity); +b0._monitorUpToDate = false; b0.value.push("-infinitY"); -b0.value.push("Infinity"); -b0.value.push("-Infinity"); +b0._monitorUpToDate = false; +b0.value.push((1 / 0)); +b0._monitorUpToDate = false; +b0.value.push((-1 / 0)); +b0._monitorUpToDate = false; +b0.value.push((0 / 0)); +b0._monitorUpToDate = false; b0.value.push("NaN"); -b0.value.push(NaN); +b0._monitorUpToDate = false; b0.value.push("nan"); +b0._monitorUpToDate = false; b0.value.push("-NaN"); +b0._monitorUpToDate = false; b0.value.push("true"); +b0._monitorUpToDate = false; b0.value.push("false"); -b0.value.push(true); -b0.value.push(false); +b0._monitorUpToDate = false; +b0.value.push(!false); +b0._monitorUpToDate = false; +b0.value.push(!!false); +b0._monitorUpToDate = false; b0.value.push(""); +b0._monitorUpToDate = false; b0.value.push("Banana"); +b0._monitorUpToDate = false; b0.value.push(" "); +b0._monitorUpToDate = false; b0.value.push("🎉"); b0._monitorUpToDate = false; return ""; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-compatibility-layer-type-barrier.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-compatibility-layer-type-barrier.sb3.tw-snapshot new file mode 100644 index 00000000000..66011d00da6 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-compatibility-layer-type-barrier.sb3.tw-snapshot @@ -0,0 +1,33 @@ +// TW Snapshot +// Input SHA-256: 7be6188a713254fa9b1f4ca207fbb6116aad958f321cd54f4f07f49a9f2c1a58 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = runtime.getOpcodeFunction("looks_sayforsecs"); +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +b0.value = (0 + 0); +yield* executeInCompatibilityLayer({"MESSAGE":"Hello!","SECS":0.1,}, b1, false, false, "d", null); +if (((toNotNaN(+b0.value) + 2) === 2)) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +thread.timer = timer(); +var a0 = Math.max(0, 1000 * 0); +runtime.requestRedraw(); +yield; +while (thread.timer.timeElapsed() < a0) { +yield; +} +thread.timer = null; +b0.value = "string"; +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-coordinate-precision.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-coordinate-precision.sb3.tw-snapshot index 3165ebb9fd7..446c232e2d2 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-coordinate-precision.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-coordinate-precision.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: b1e62179f7a495c46c7e9c64a03d405924f6011b66aa71f6ec0f1781b936d38c // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = runtime.getSpriteTargetByName("Sprite1"); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 6", target); @@ -22,7 +19,7 @@ target.setXY(target.x + -9e-10, target.y); if (((b0 ? b0.x : 0) === 1.0000000000000007e-10)) { runtime.ext_scratch3_looks._say("pass 'of' never rounds - positive x", target); } -if (compareEqual(limitPrecision(target.x), 0)) { +if ((limitPrecision(target.x) === 0)) { runtime.ext_scratch3_looks._say("pass x slightly above 0 rounds", target); } target.setXY(target.x + -9e-10, target.y); @@ -30,7 +27,7 @@ target.setXY(target.x, target.y + 0); if (((b0 ? b0.x : 0) === -7.999999999999999e-10)) { runtime.ext_scratch3_looks._say("pass 'of' never rounds and change x - negative x", target); } -if (compareEqual(limitPrecision(target.x), 0)) { +if ((limitPrecision(target.x) === 0)) { runtime.ext_scratch3_looks._say("pass x slightly below 0 rounds", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-counter.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-counter.sb3.tw-snapshot index 7814ceddea4..838b27fe8f0 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-counter.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-counter.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 29dd30c632645f071bfd450530dab86dc85a2c1cf30564bee984394a790eca6a // 2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { if ((runtime.ext_scratch3_control._counter === 10)) { runtime.ext_scratch3_looks._say("pass global", target); @@ -15,13 +12,10 @@ retire(); return; }; }) // 1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 5", target); -if (compareEqual(runtime.ext_scratch3_control._counter, 0)) { +if ((runtime.ext_scratch3_control._counter === 0)) { runtime.ext_scratch3_looks._say("pass initial value = 0", target); } runtime.ext_scratch3_control._counter++; @@ -33,7 +27,7 @@ if ((runtime.ext_scratch3_control._counter === 2)) { runtime.ext_scratch3_looks._say("pass incr 2", target); } runtime.ext_scratch3_control._counter = 0; -if (compareEqual(runtime.ext_scratch3_control._counter, 0)) { +if ((runtime.ext_scratch3_control._counter === 0)) { runtime.ext_scratch3_looks._say("pass clear = 0", target); } for (var a0 = 10; a0 > 0; a0--) { diff --git a/test/snapshot/__snapshots__/warp-timer/tw-custom-report-repeat.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-custom-report-repeat.sb3.tw-snapshot index 7a823128c3a..d6422034fe0 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-custom-report-repeat.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-custom-report-repeat.sb3.tw-snapshot @@ -2,15 +2,12 @@ // Input SHA-256: d293b52c4330db5d33eddb66742496017b5c96baacc41654961cfa97d08668d8 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); b0.value = 0; -for (var a0 = 40; a0 > 0; a0--) { +for (var a0 = toNotNaN(+thread.procedures["Zblock name"]()); a0 >= 0.5; a0--) { b0.value = (toNotNaN(+b0.value) + 1); yield; } @@ -22,10 +19,7 @@ retire(); return; }; }) // Sprite1 Zblock name -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_block_name () { return 40; return ""; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-equals-switch.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-equals-switch.sb3.tw-snapshot index e8075a9abd1..8135332193c 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-equals-switch.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-equals-switch.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 55ae20c1bc8ad00aa7aa1ae5c85ce475c797652408507387fbbc6788a58a48fa // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); yield* waitThreads(startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "t1" })); @@ -15,46 +12,36 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["switchsubj-id"]; const b1 = stage.variables["switchlist-id"]; return function* genXYZ () { -b0.value = (b1.value[0] ?? ""); -switch ((("" + b0.value)).toLowerCase()) { -case "hello": { +b0.value = (b1.value[1 - 1] ?? ""); +if ((("" + b0.value).toLowerCase() === "hello".toLowerCase())) { runtime.ext_scratch3_looks._say("pass string", target); retire(); return; -break; } -case "world": { +} +if ((("" + b0.value).toLowerCase() === "world".toLowerCase())) { runtime.ext_scratch3_looks._say("fail string-wrong-branch", target); retire(); return; -break; } } runtime.ext_scratch3_looks._say("fail string-no-match", target); retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["switchsubj-id"]; const b1 = stage.variables["switchlist-id"]; return function* genXYZ () { -b0.value = (b1.value[1] ?? ""); -switch (toSwitchNumber(b0.value)) { -case 0: { +b0.value = (b1.value[2 - 1] ?? ""); +if (compareEqual(b0.value, 0)) { runtime.ext_scratch3_looks._say("fail numeric-matched-0", target); retire(); return; -break; } -case 1: { +} +if ((toNotNaN(+b0.value) === 1)) { runtime.ext_scratch3_looks._say("fail numeric-matched-1", target); retire(); return; -break; } } runtime.ext_scratch3_looks._say("pass numeric", target); retire(); return; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-exit-state-accounts-for-yields-in-procedures.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-exit-state-accounts-for-yields-in-procedures.sb3.tw-snapshot new file mode 100644 index 00000000000..14cf2f1aa3b --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-exit-state-accounts-for-yields-in-procedures.sb3.tw-snapshot @@ -0,0 +1,37 @@ +// TW Snapshot +// Input SHA-256: 4715c75fe8effcdcdea3ad810949e33a7b6beb3fbd253c1edc2ed4f2bd093df3 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = stage.variables["FpLI$ida6)qR,q~y`1|*"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +b0.value = (1 + 2); +yield* thread.procedures["Zsomething that yields"](); +if ((("" + listGet(b1.value, b0.value)).toLowerCase() === "the only thing".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Zsomething that yields +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +return function* genXYZ_something_that_yield () { +for (var a0 = 2; a0 > 0; a0--) { +yield; +} +return ""; +}; }) + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +for (var a0 = 1; a0 > 0; a0--) { +yield; +} +b0.value = "random"; +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-boolean-number-comparison.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-boolean-number-comparison.sb3.tw-snapshot index 33d11f96163..754e542daa6 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-boolean-number-comparison.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-boolean-number-comparison.sb3.tw-snapshot @@ -2,16 +2,21 @@ // Input SHA-256: fd48053df5e75de0ec56ac106699076335b2bd46266f8da4e4d81d52e29f5c29 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 4", target); +if (compareGreaterThan(("something".toLowerCase() === "something".toLowerCase()), ("0" + ""))) { runtime.ext_scratch3_looks._say("pass", target); +} +if (compareLessThan(("something".toLowerCase() === "else".toLowerCase()), ("1" + ""))) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((+("something".toLowerCase() === "something".toLowerCase())) > (0 + 0))) { runtime.ext_scratch3_looks._say("pass", target); +} +if (((+("something".toLowerCase() === "else".toLowerCase())) < (1 + 0))) { runtime.ext_scratch3_looks._say("pass", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-non-finite-direction.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-non-finite-direction.sb3.tw-snapshot index 7207071a203..f6f6db0a82b 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-non-finite-direction.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-non-finite-direction.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 1fa5a314682ce218a097be41607e4eb456a2b046a47ca46d01a1033323afa544 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = runtime.getOpcodeFunction("motion_pointtowards"); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 4", target); @@ -13,12 +10,12 @@ target.setDirection(95); if ((target.direction === 95)) { runtime.ext_scratch3_looks._say("pass 1", target); } -target.setDirection(Infinity); +target.setDirection((1 / 0)); if ((target.direction === 95)) { runtime.ext_scratch3_looks._say("pass 2", target); } -target.setDirection(0); -if (compareEqual(target.direction, 0)) { +target.setDirection(toNotNaN((0 / 0))); +if ((target.direction === 0)) { runtime.ext_scratch3_looks._say("pass 3", target); } yield* executeInCompatibilityLayer({"TOWARDS":"Sprite2",}, b0, false, false, "g", null); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-random-with-invalid-number-with-period.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-random-with-invalid-number-with-period.sb3.tw-snapshot index b895f028d4d..4fcfeee75e0 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-random-with-invalid-number-with-period.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-random-with-invalid-number-with-period.sb3.tw-snapshot @@ -2,31 +2,28 @@ // Input SHA-256: 725e0683c8cd39c78a143727bf26f8827d1e9fd627eef68a772d8a3a06806c65 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 6", target); -b0.value = runtime.ext_scratch3_operators._random("an invalid number.", 1); -if (compareGreaterThan(b0.value, 0)) { +b0.value = runtime.ext_scratch3_operators._random(("an invalid number" + "."), 1); +if (!(b0.value <= 0)) { runtime.ext_scratch3_looks._say("pass", target); } -if (compareLessThan(b0.value, 1)) { +if ((b0.value < 1)) { runtime.ext_scratch3_looks._say("pass", target); } -if ((("" + b0.value).toLowerCase().indexOf(".") !== -1)) { +if ((("" + b0.value).toLowerCase().indexOf(".".toLowerCase()) !== -1)) { runtime.ext_scratch3_looks._say("pass", target); } -b0.value = runtime.ext_scratch3_operators._random(1, "an invalid number."); -if (compareGreaterThan(b0.value, 0)) { +b0.value = runtime.ext_scratch3_operators._random(1, ("an invalid number" + ".")); +if (!(b0.value <= 0)) { runtime.ext_scratch3_looks._say("pass", target); } -if (compareLessThan(b0.value, 1)) { +if ((b0.value < 1)) { runtime.ext_scratch3_looks._say("pass", target); } -if ((("" + b0.value).toLowerCase().indexOf(".") !== -1)) { +if ((("" + b0.value).toLowerCase().indexOf(".".toLowerCase()) !== -1)) { runtime.ext_scratch3_looks._say("pass", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-variable-id-name-desync-name-fallback.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-variable-id-name-desync-name-fallback.sb3.tw-snapshot index c1a95c0742b..5b92a63c221 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-variable-id-name-desync-name-fallback.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-variable-id-name-desync-name-fallback.sb3.tw-snapshot @@ -2,24 +2,21 @@ // Input SHA-256: 1d02d01ddcd53c67e093bda79912f19683829f86fd23e1f77cbfc0aef03dc0f3 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = target.variables["gTtSj;o_E;Snkn620KF."]; const b1 = target.variables["zShM`!CD?d_|Z,]5X}N6"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); b0.value = 2; -if ((toNotNaN(+b0.value) === 2)) { +if ((b0.value === 2)) { runtime.ext_scratch3_looks._say("pass variable", target); } b1.value = []; b1.value.push(3); -if ((toNotNaN(+(b1.value[0] ?? "")) === 3)) { +b1._monitorUpToDate = false; +if ((toNotNaN(+(b1.value[1 - 1] ?? "")) === 3)) { runtime.ext_scratch3_looks._say("pass list", target); } runtime.ext_scratch3_looks._say("end", target); -b1._monitorUpToDate = false; retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-wait-zero-seconds-in-warp-mode.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-wait-zero-seconds-in-warp-mode.sb3.tw-snapshot index 36cd156fab0..ec8075106ae 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-wait-zero-seconds-in-warp-mode.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-forkphorus-515-wait-zero-seconds-in-warp-mode.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: a8576b7695ad77f7d5a7ac9fb76d31f026c0869f16f55d16fa40b85972b43e30 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = runtime.getOpcodeFunction("sound_setvolumeto"); const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { @@ -24,17 +21,13 @@ retire(); return; }; }) // Sprite1 Wno refresh -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = runtime.getOpcodeFunction("music_restForBeats"); const b1 = runtime.getOpcodeFunction("music_playDrumForBeats"); return function* genXYZ_no_refresh () { for (var a0 = 30; a0 > 0; a0--) { thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); while (thread.timer.timeElapsed() < a1) { if (isStuck()) yield; @@ -49,27 +42,20 @@ return ""; }; }) // Sprite1 Wruns below with no refresh -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ_runs_below_with_no_r () { yield* thread.procedures["Whas refresh"](); return ""; }; }) // Sprite1 Whas refresh -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = runtime.getOpcodeFunction("music_restForBeats"); const b1 = runtime.getOpcodeFunction("music_playDrumForBeats"); return function* genXYZ_has_refresh () { for (var a0 = 30; a0 > 0; a0--) { thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); while (thread.timer.timeElapsed() < a1) { if (isStuck()) yield; @@ -84,10 +70,7 @@ return ""; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { while (true) { diff --git a/test/snapshot/__snapshots__/warp-timer/tw-gh-201-stop-script-does-not-reevaluate-arguments.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-gh-201-stop-script-does-not-reevaluate-arguments.sb3.tw-snapshot index ee6830411fc..9bb8aee3462 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-gh-201-stop-script-does-not-reevaluate-arguments.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-gh-201-stop-script-does-not-reevaluate-arguments.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: fd981742e0e4299bad5a89349635d3a7d0467d8163ae77ba4bafe43c97849bae // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 0", target); thread.procedures["Zfoo %s"](""); @@ -14,20 +11,14 @@ retire(); return; }; }) // Sprite1 Zfoo %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_foo_ (p0) { return ""; return ""; }; }) // Sprite1 Zno op -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_no_op () { return ""; }; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-gh-249-quicksort.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-gh-249-quicksort.sb3.tw-snapshot new file mode 100644 index 00000000000..f6de384583c --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-gh-249-quicksort.sb3.tw-snapshot @@ -0,0 +1,117 @@ +// TW Snapshot +// Input SHA-256: ce657aa0f3e55d0c2166813c9fa3dd076c3f0c81df2e527f44d0ad31856a448d + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +yield* thread.procedures["Wrun"](); +yield* thread.procedures["Wvalidate"](); +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Wrun +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["EF^k=u-t@S)w60;RP?dZ-list-list"]; +const b1 = stage.variables["rQq!wAuU2T9DV9,S[/s."]; +return function* genXYZ_run () { +b0.value = []; +for (var a0 = 100; a0 > 0; a0--) { +b0.value.push((b1.value[(b0.value.length + 1) - 1] ?? "")); +b0._monitorUpToDate = false; +if (isStuck()) yield; +} +yield* thread.procedures["Wqsort %s %s"](1,b0.value.length); +return ""; +}; }) + +// Sprite1 Wvalidate +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["7AH{dO^X;}C[{[l~g-7m"]; +const b1 = stage.variables["gPJ}c-PZz?Y+_L][iMU_"]; +const b2 = stage.variables["EF^k=u-t@S)w60;RP?dZ-list-list"]; +const b3 = stage.variables["FsKqV/2kid0gw0J+Jj(c"]; +return function* genXYZ_validate () { +b0.value = 1; +b1.value = 1; +for (var a0 = b2.value.length; a0 > 0; a0--) { +if (!compareEqual(listGet(b2.value, b1.value), listGet(b3.value, b1.value))) { +b0.value = 0; +runtime.ext_scratch3_looks._say(("fail mismatch at index " + ("" + b1.value)), target); +} +b1.value = (toNotNaN(+b1.value) + 1); +if (isStuck()) yield; +} +if ((toNotNaN(+b0.value) === 1)) { +runtime.ext_scratch3_looks._say("pass sorted", target); +} +return ""; +}; }) + +// Sprite1 Wqsort %s %s +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["EF^k=u-t@S)w60;RP?dZ-pivot-"]; +const b1 = stage.variables["EF^k=u-t@S)w60;RP?dZ-list-list"]; +const b2 = stage.variables["EF^k=u-t@S)w60;RP?dZ-low-"]; +const b3 = stage.variables["EF^k=u-t@S)w60;RP?dZ-high-"]; +const b4 = stage.variables["EF^k=u-t@S)w60;RP?dZ-tmp-"]; +const b5 = target.variables["JIHtr29*ug5G;5*`f2.K-i-"]; +const b6 = target.variables["JIHtr29*ug5G;5*`f2.K-min pos-"]; +const b7 = target.variables["JIHtr29*ug5G;5*`f2.K-min-"]; +const b8 = target.variables["JIHtr29*ug5G;5*`f2.K-j-"]; +return function* genXYZ_qsort__ (p0,p1) { +if (compareLessThan(p0, p1)) { +if (!((toNotNaN(+p1) - toNotNaN(+p0)) <= 7)) { +b0.value = (b1.value[((toNotNaN((toNotNaN(+p1) + toNotNaN(+p0))) / 2) | 0) - 1] ?? ""); +b2.value = p0; +b3.value = p1; +while (true) { +while (compareLessThan(listGet(b1.value, b2.value), b0.value)) { +b2.value = (toNotNaN(+b2.value) + 1); +if (isStuck()) yield; +} +while (compareGreaterThan(listGet(b1.value, b3.value), b0.value)) { +b3.value = (toNotNaN(+b3.value) + -1); +if (isStuck()) yield; +} +if (compareGreaterThan(b2.value, b3.value)) { +yield* thread.procedures["Wqsort %s %s"](p0,b3.value); +yield* thread.procedures["Wqsort %s %s"](b2.value,p1); +return ""; +} else { +b4.value = listGet(b1.value, b2.value); +listReplace(b1, b2.value, listGet(b1.value, b3.value)); +listReplace(b1, b3.value, b4.value); +b2.value = (toNotNaN(+b2.value) + 1); +b3.value = (toNotNaN(+b3.value) + -1); +} +if (isStuck()) yield; +} +} else { +b5.value = p0; +for (var a0 = toNotNaN((toNotNaN(+p1) - toNotNaN(+p0))); a0 >= 0.5; a0--) { +b6.value = b5.value; +b7.value = listGet(b1.value, b5.value); +b8.value = (toNotNaN(+b5.value) + 1); +for (var a1 = toNotNaN((toNotNaN(+p1) - toNotNaN(+b5.value))); a1 >= 0.5; a1--) { +if (compareLessThan(listGet(b1.value, b8.value), b7.value)) { +b7.value = listGet(b1.value, b8.value); +b6.value = b8.value; +} +b8.value = (toNotNaN(+b8.value) + 1); +if (isStuck()) yield; +} +if (compareEqual(b6.value, b5.value)) { +} else { +b4.value = listGet(b1.value, b5.value); +listReplace(b1, b5.value, b7.value); +listReplace(b1, b6.value, b4.value); +} +b5.value = (toNotNaN(+b5.value) + 1); +if (isStuck()) yield; +} +} +} +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-letter-of-case.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-letter-of-case.sb3.tw-snapshot index a4a084349bc..aa37a6e0598 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-letter-of-case.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-letter-of-case.sb3.tw-snapshot @@ -2,16 +2,13 @@ // Input SHA-256: da467c1780e50ee05d590848c641a3e076d98ec69a957a10cf125f1f0a739400 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { -runtime.ext_scratch3_looks._say("H", target); -runtime.ext_scratch3_looks._say("A", target); -runtime.ext_scratch3_looks._say("C", target); -runtime.ext_scratch3_looks._say("E", target); -runtime.ext_scratch3_looks._say("o", target); +runtime.ext_scratch3_looks._say((("Hello")[1 - 1] || ""), target); +runtime.ext_scratch3_looks._say((("ABC")[1 - 1] || ""), target); +runtime.ext_scratch3_looks._say((("ABC")[3 - 1] || ""), target); +runtime.ext_scratch3_looks._say((("MixEd")[4 - 1] || ""), target); +runtime.ext_scratch3_looks._say((("Hello")[5 - 1] || ""), target); runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-list-any.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-list-any.sb3.tw-snapshot index d3a69cf84ab..e099222961b 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-list-any.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-list-any.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: a4ae71d2c1b70f29a667c2d582b24702068f1d128512b7aee53b2feddd274527 // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["eFlmP1{XC+I1:h0Yln.K"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 7", target); @@ -32,7 +29,7 @@ listDelete(b0, "any"); if ((b0.value.length === 2)) { runtime.ext_scratch3_looks._say("pass", target); } -if (compareEqual(listGet(b0.value, "*"), "")) { +if ((("" + listGet(b0.value, "*")).toLowerCase() === "".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-loop-condition-optimization-gh-276.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-loop-condition-optimization-gh-276.sb3.tw-snapshot new file mode 100644 index 00000000000..ca63598431c --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-loop-condition-optimization-gh-276.sb3.tw-snapshot @@ -0,0 +1,28 @@ +// TW Snapshot +// Input SHA-256: 3c81a01417b9a927457132a5f89b63e54b2499714376246739535b51dbce2d45 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +yield* thread.procedures["Wtest %s"]("random"); +if ((("" + b0.value).toLowerCase() === "random".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Wtest %s +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = stage.variables["t)]?yi[*8XU73qhMqOa8"]; +return function* genXYZ_test_ (p0) { +b0.value = p0; +while (!(("" + listGet(b1.value, b0.value)).toLowerCase() === "something".toLowerCase())) { +b0.value = (toNotNaN(+b0.value) + 1); +if (isStuck()) yield; +} +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-native-switch.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-native-switch.sb3.tw-snapshot index 2ed9f9f0de9..2c8635d291a 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-native-switch.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-native-switch.sb3.tw-snapshot @@ -2,14 +2,11 @@ // Input SHA-256: cb45d7d2caeedd6bfe00857c96f32600d3d9b7d8a64de88ca67eb4b30319f67c // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["sl-id"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 3", target); -switch (("" + (b0.value[0] ?? ""))) { +switch (("" + (b0.value[1 - 1] ?? ""))) { case "hello": { runtime.ext_scratch3_looks._say("fail-wrong-case", target); break; @@ -25,7 +22,7 @@ break; } default: runtime.ext_scratch3_looks._say("fail-default", target); } -switch (("" + (b0.value[1] ?? ""))) { +switch (("" + (b0.value[2 - 1] ?? ""))) { case "0": { runtime.ext_scratch3_looks._say("fail", target); break; @@ -41,7 +38,7 @@ break; } default: runtime.ext_scratch3_looks._say("pass s1-default", target); } -switch (("" + (b0.value[2] ?? ""))) { +switch (("" + (b0.value[3 - 1] ?? ""))) { case "1": { runtime.ext_scratch3_looks._say("fail", target); break; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-non-warp-loop-condition-analysis.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-non-warp-loop-condition-analysis.sb3.tw-snapshot new file mode 100644 index 00000000000..6dda54881f6 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-non-warp-loop-condition-analysis.sb3.tw-snapshot @@ -0,0 +1,28 @@ +// TW Snapshot +// Input SHA-256: be149d21cc69628647000cc698ebd60949252730a0ea7b19f71cc85fe927b294 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["%ehs:~!Y0l-5=!mnd-B?"]; +const b1 = stage.variables["=3aHfv[mKa)v,Wfpy:y?"]; +const b2 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +b0.value = []; +b0.value.push((1 + 2)); +b0._monitorUpToDate = false; +b0.value.push("eof"); +b0._monitorUpToDate = false; +b1.value = 0; +b2.value = "bwah"; +while (!(("" + b2.value).toLowerCase() === "eof".toLowerCase())) { +b1.value = (toNotNaN(+b1.value) + 1); +b2.value = (b0.value[(b1.value | 0) - 1] ?? ""); +yield; +} +if ((toNotNaN(+b1.value) === 2)) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-obsolete-blocks.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-obsolete-blocks.sb3.tw-snapshot index 9bd7bd5c8ef..71a44853beb 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-obsolete-blocks.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-obsolete-blocks.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 58dd6f369897907ea46fffbb8210d8bc15db59f26ce117ff4211035afff17f23 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; const b1 = runtime.getOpcodeFunction("sensing_userid"); const b2 = runtime.getOpcodeFunction("motion_xscroll"); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-one-divide-negative-zero.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-one-divide-negative-zero.sb3.tw-snapshot index 991e796953c..3e2eeffa931 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-one-divide-negative-zero.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-one-divide-negative-zero.sb3.tw-snapshot @@ -2,13 +2,12 @@ // Input SHA-256: 169af11f112ebea3d6768317652a72a6374c407f432537990689d46080fe2b92 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); +if (((1 / -0) === -Infinity)) { runtime.ext_scratch3_looks._say("pass", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-preciseProjectTimer-drift-453118719.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-preciseProjectTimer-drift-453118719.sb3.tw-snapshot index 0b34b8a4f23..3b2521664aa 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-preciseProjectTimer-drift-453118719.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-preciseProjectTimer-drift-453118719.sb3.tw-snapshot @@ -2,11 +2,7 @@ // Input SHA-256: 19e0b3f9dcac763041039a8ffe87b6732eb744f9ebb136e8d61a53ccf19118e3 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["PsY$$vp$IVH;dDAr[q2h"]; const b1 = stage.variables["l^q!%fq]Bv;72dlGf}^Z"]; return function* genXYZ () { @@ -15,7 +11,7 @@ runtime.ext_scratch3_looks._say("plan 0", target); for (var a0 = 30; a0 > 0; a0--) { b1.value = runtime.ioDevices.clock.projectTimer(); thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a1) { @@ -30,10 +26,7 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["l^q!%fq]Bv;72dlGf}^Z"]; const b1 = runtime.getOpcodeFunction("event_whengreaterthan"); const b2 = stage.variables["PsY$$vp$IVH;dDAr[q2h"]; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-prefers-first-occurence-of-procedure-387608267.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-prefers-first-occurence-of-procedure-387608267.sb3.tw-snapshot index f975174e6e0..adf5671a8c7 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-prefers-first-occurence-of-procedure-387608267.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-prefers-first-occurence-of-procedure-387608267.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 5b964fa791468016b188af74e50cadad73d482be066b104bb22faff7e4a156dc // Player script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); thread.procedures["ZSet Costume"](); @@ -14,10 +11,7 @@ retire(); return; }; }) // Player ZSet Costume -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_Set_Costume () { runtime.ext_scratch3_looks._say("pass", target); return ""; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-procedure-arguments-with-same-name.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-procedure-arguments-with-same-name.sb3.tw-snapshot index d1e2d9c353f..5766bd76809 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-procedure-arguments-with-same-name.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-procedure-arguments-with-same-name.sb3.tw-snapshot @@ -2,35 +2,26 @@ // Input SHA-256: a340f37844807c66f3b85eb4e85c8092a779d33d50e5655e035420ae05cea26c // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); thread.procedures["Znumber or text %s %s"]("bad","ok"); -thread.procedures["Zboolean %b %b"]("false",true); +thread.procedures["Zboolean %b %b"]("false",!false); runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) // Sprite1 Znumber or text %s %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_number_or_text__ (p0,p1) { -if ((("" + p1).toLowerCase() === "ok")) { +if ((("" + p1).toLowerCase() === "ok".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } return ""; }; }) // Sprite1 Zboolean %b %b -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_boolean__ (p0,p1) { if (toBoolean(p1)) { runtime.ext_scratch3_looks._say("pass", target); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-procedure-call-resets-variable-input-types-430811055.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-procedure-call-resets-variable-input-types-430811055.sb3.tw-snapshot index f1ee6475cd1..98305cc14c7 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-procedure-call-resets-variable-input-types-430811055.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-procedure-call-resets-variable-input-types-430811055.sb3.tw-snapshot @@ -2,16 +2,13 @@ // Input SHA-256: 2afbb43dad9e66e37997e13bf3ffb90bf39effd8974c2eb1a95bed61d437b6de // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); b0.value = ""; -b0.value = "help"; -if (!compareEqual(b0.value, "")) { +thread.procedures["Zdo something"](); +if (!(b0.value.toLowerCase() === "".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } runtime.ext_scratch3_looks._say("end", target); @@ -19,10 +16,7 @@ retire(); return; }; }) // Sprite1 Zdo something -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function funXYZ_do_something () { b0.value = "help"; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-procedure-prototype-exists-but-not-definition-549160843.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-procedure-prototype-exists-but-not-definition-549160843.sb3.tw-snapshot index e50a1487b34..e0e3857ecd3 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-procedure-prototype-exists-but-not-definition-549160843.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-procedure-prototype-exists-but-not-definition-549160843.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 9805621c896afb4a8ed71236417a0311e5f4f38378214914625248b6157178b4 // Apple script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 0", target); runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-non-existant.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-non-existant.sb3.tw-snapshot index c667e699f94..2cf755d294c 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-non-existant.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-non-existant.sb3.tw-snapshot @@ -2,18 +2,14 @@ // Input SHA-256: b9110339d39947f68168cbb129a20b23b7d4e607ffd5624bd67e096451f6a329 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ () { b0.value = 0; while (true) { b0.value = (toNotNaN(+b0.value) + 1); thread.timer = timer(); -var a0 = max(0, 1000 * -1); +var a0 = Math.max(0, 1000 * -1); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -26,36 +22,31 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); b0.value = 0; +if (compareEqual(thread.procedures["Zinvalid params - reporter"](), 0)) { runtime.ext_scratch3_looks._say("pass invalid params reporter", target); +} +if (compareEqual(thread.procedures["Zinvalid params - boolean"](), 0)) { runtime.ext_scratch3_looks._say("pass invalid params boolean", target); +} runtime.stopForTarget(target, thread); runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) // Sprite1 Zinvalid params - reporter -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_invalid_params___rep () { return 0; return ""; }; }) // Sprite1 Zinvalid params - boolean -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_invalid_params___boo () { return 0; return ""; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-non-existent.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-non-existent.sb3.tw-snapshot index db382d3bb01..7c867947149 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-non-existent.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-non-existent.sb3.tw-snapshot @@ -2,16 +2,13 @@ // Input SHA-256: 2d07ab31e7f1e6f263996fa42ff79f849fed048a047d68960bd324960bcc1452 // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); b0.value = "discard me"; b0.value = ""; -if (compareEqual(b0.value, "")) { +if ((("" + b0.value).toLowerCase() === "".toLowerCase())) { runtime.ext_scratch3_looks._say("pass non existent procedure returned empty string", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-recursion.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-recursion.sb3.tw-snapshot index 879dc13362b..d0e29b100c2 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-recursion.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-recursion.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: b1802636bbbd479dcf8634a525798c5b4dd9b0201cf6af6f5b4879455368c328 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { @@ -17,7 +14,7 @@ runtime.ext_scratch3_looks._say("pass non warp recursion yields", target); } b0.value = 0; b1.value = thread.procedures["Wwarp recursion should not yield %s"](8); -if (compareEqual(b0.value, 0)) { +if ((b0.value === 0)) { runtime.ext_scratch3_looks._say("pass warp recursion does not yield", target); } b0.value = 0; @@ -33,10 +30,7 @@ retire(); return; }; }) // Sprite1 Znon warp recursion should yield %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ_non_warp_recursion_s (p0) { if (compareGreaterThan(p0, 0)) { return (yield* yieldThenCallGenerator(thread.procedures["Znon warp recursion should yield %s"], (toNotNaN(+p0) - 1))); @@ -45,10 +39,7 @@ return ""; }; }) // Sprite1 Wwarp recursion should not yield %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_warp_recursion_shoul (p0) { if (compareGreaterThan(p0, 0)) { return thread.procedures["Wwarp recursion should not yield %s"]((toNotNaN(+p0) - 1)); @@ -57,10 +48,7 @@ return ""; }; }) // Sprite1 Zfib %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ_fib_ (p0) { if (compareLessThan(p0, 2)) { return p0; @@ -71,14 +59,11 @@ return ""; }; }) // Sprite1 Zrecursing yields between each %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ_recursing_yields_bet (p0) { -if ((("" + p0).toLowerCase() === "initial")) { +if ((("" + p0).toLowerCase() === "initial".toLowerCase())) { b0.value = 0; b1.value = (toNotNaN(+(yield* yieldThenCallGenerator(thread.procedures["Zrecursing yields between each %s"], 1))) + toNotNaN((toNotNaN(+(yield* yieldThenCallGenerator(thread.procedures["Zrecursing yields between each %s"], 1))) + toNotNaN((toNotNaN(+(yield* yieldThenCallGenerator(thread.procedures["Zrecursing yields between each %s"], 2))) + toNotNaN((toNotNaN(+(yield* yieldThenCallGenerator(thread.procedures["Zrecursing yields between each %s"], 2))) + toNotNaN((toNotNaN(+(yield* yieldThenCallGenerator(thread.procedures["Zrecursing yields between each %s"], 3))) + toNotNaN(+(yield* yieldThenCallGenerator(thread.procedures["Zrecursing yields between each %s"], 3)))))))))))); if ((toNotNaN(+b0.value) === 3)) { @@ -97,37 +82,34 @@ return ""; }; }) // Sprite1 Zrecursing arguments eval order %s %s %s %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["4HH82mPlVMOONdl(Ot*7"]; const b1 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; const b2 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ_recursing_arguments_ (p0,p1,p2,p3) { -if ((("" + p0).toLowerCase() === "initial")) { +if ((("" + p0).toLowerCase() === "initial".toLowerCase())) { b0.value = []; b1.value = 0; b2.value = (yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 1",(yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 2",(yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 3",(yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 4","","","")),(yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 5","","","")),(yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 6","","","")))),"","")),"",(yield* yieldThenCallGenerator(thread.procedures["Zrecursing arguments eval order %s %s %s %s"], "child 7","","","")))); -if ((("" + (b0.value[0] ?? "")).toLowerCase() === "1/child 4")) { +if ((("" + (b0.value[1 - 1] ?? "")).toLowerCase() === "1/child 4".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 1", target); } -if ((("" + (b0.value[1] ?? "")).toLowerCase() === "1/child 5")) { +if ((("" + (b0.value[2 - 1] ?? "")).toLowerCase() === "1/child 5".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 2", target); } -if ((("" + (b0.value[2] ?? "")).toLowerCase() === "2/child 6")) { +if ((("" + (b0.value[3 - 1] ?? "")).toLowerCase() === "2/child 6".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 3", target); } -if ((("" + (b0.value[3] ?? "")).toLowerCase() === "2/child 3")) { +if ((("" + (b0.value[4 - 1] ?? "")).toLowerCase() === "2/child 3".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 4", target); } -if ((("" + (b0.value[4] ?? "")).toLowerCase() === "3/child 2")) { +if ((("" + (b0.value[5 - 1] ?? "")).toLowerCase() === "3/child 2".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 5", target); } -if ((("" + (b0.value[5] ?? "")).toLowerCase() === "3/child 7")) { +if ((("" + (b0.value[6 - 1] ?? "")).toLowerCase() === "3/child 7".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 6", target); } -if ((("" + (b0.value[6] ?? "")).toLowerCase() === "4/child 1")) { +if ((("" + (b0.value[7 - 1] ?? "")).toLowerCase() === "4/child 1".toLowerCase())) { runtime.ext_scratch3_looks._say("pass recurse arg order - 7", target); } if ((b0.value.length === 7)) { @@ -135,24 +117,20 @@ runtime.ext_scratch3_looks._say("pass recurse arg order - length is correct", ta } } else { b0.value.push((("" + b1.value) + ("/" + ("" + p0)))); -} b0._monitorUpToDate = false; +} return ""; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ () { b0.value = 0; while (true) { b0.value = (toNotNaN(+b0.value) + 1); thread.timer = timer(); -var a0 = max(0, 1000 * -1); +var a0 = Math.max(0, 1000 * -1); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { diff --git a/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-simple.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-simple.sb3.tw-snapshot index 8c6d150f431..c14aa78f900 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-simple.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-simple.sb3.tw-snapshot @@ -2,15 +2,14 @@ // Input SHA-256: cd516553f3cbf4a41ae9a8bc1f5d06a3392d365226bccdfa294578314f18facb // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 8", target); +if ((("" + thread.procedures["Zsimplest"]()).toLowerCase() === "It works!".toLowerCase())) { runtime.ext_scratch3_looks._say("pass simplest", target); -if ((("" + thread.procedures["Znesting 1"]()).toLowerCase() === "42-54")) { +} +if ((("" + thread.procedures["Znesting 1"]()).toLowerCase() === "42-54".toLowerCase())) { runtime.ext_scratch3_looks._say("pass nesting1", target); } if ((toNotNaN(+thread.procedures["Wwarp fib %s"](12)) === 144)) { @@ -20,7 +19,7 @@ if ((toNotNaN(+thread.procedures["Wfactorial %s"](12)) === 479001600)) { runtime.ext_scratch3_looks._say("pass factorial 12", target); } b0.value = thread.procedures["Zno shadowing 1 %s %s"]("f","g"); -if (compareEqual(b0.value, "")) { +if ((("" + b0.value).toLowerCase() === "".toLowerCase())) { runtime.ext_scratch3_looks._say("pass default return value", target); } runtime.ext_scratch3_looks._say("end", target); @@ -28,20 +27,14 @@ retire(); return; }; }) // Sprite1 Zsimplest -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_simplest () { return "It works!"; return ""; }; }) // Sprite1 Znesting 1 -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_nesting_1 () { thread.procedures["Znesting 2"](); return (("" + thread.procedures["Znesting 3 %s %s"](6,7)) + ("" + thread.procedures["Znesting 3 %s %s"](-1,54))); @@ -49,20 +42,14 @@ return ""; }; }) // Sprite1 Wwarp fib %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_warp_fib_ (p0) { return thread.procedures["Wfib %s"](p0); return ""; }; }) // Sprite1 Wfactorial %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_factorial_ (p0) { if (compareGreaterThan(p0, 1)) { return (toNotNaN(+p0) * toNotNaN(+thread.procedures["Wfactorial %s"]((toNotNaN(+p0) - 1)))); @@ -72,51 +59,39 @@ return ""; }; }) // Sprite1 Zno shadowing 1 %s %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function funXYZ_no_shadowing_1__ (p0,p1) { -if (((("" + p0).toLowerCase() === "f") && (("" + p1).toLowerCase() === "g"))) { +if (((("" + p0).toLowerCase() === "f".toLowerCase()) && (("" + p1).toLowerCase() === "g".toLowerCase()))) { runtime.ext_scratch3_looks._say("pass shadow check 1", target); } b0.value = thread.procedures["Zno shadowing 2 %s %s"](1,2); -if (((("" + p0).toLowerCase() === "f") && (("" + p1).toLowerCase() === "g"))) { +if (((("" + p0).toLowerCase() === "f".toLowerCase()) && (("" + p1).toLowerCase() === "g".toLowerCase()))) { runtime.ext_scratch3_looks._say("pass shadow check 2", target); } b0.value = thread.procedures["Zno shadowing 2 %s %s"](3,4); -if (((("" + p0).toLowerCase() === "f") && (("" + p1).toLowerCase() === "g"))) { +if (((("" + p0).toLowerCase() === "f".toLowerCase()) && (("" + p1).toLowerCase() === "g".toLowerCase()))) { runtime.ext_scratch3_looks._say("pass shadow check 3", target); } return ""; }; }) // Sprite1 Znesting 2 -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_nesting_2 () { return "discard nesting 2"; return ""; }; }) // Sprite1 Znesting 3 %s %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_nesting_3__ (p0,p1) { return (toNotNaN(+p0) * toNotNaN(+p1)); return ""; }; }) // Sprite1 Wfib %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_fib_ (p0) { if (compareLessThan(p0, 2)) { return p0; @@ -127,10 +102,7 @@ return ""; }; }) // Sprite1 Zno shadowing 2 %s %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_no_shadowing_2__ (p0,p1) { return "discard shadow 2"; return ""; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-stops-scripts.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-stops-scripts.sb3.tw-snapshot index b0d2a4e3cc8..287090d5661 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-stops-scripts.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-stops-scripts.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 27368530b97e0ab5053bf4faf8fd116aa30cea34adcbd95fc6ddcf0a9d6d4976 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["PsAI*C{QHI3*4?O8p#TM"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); @@ -22,10 +19,7 @@ retire(); return; }; }) // Sprite1 Wreturn stops the script immediately -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["PsAI*C{QHI3*4?O8p#TM"]; return function* genXYZ_return_stops_the_scr () { b0.value = 0; @@ -41,10 +35,7 @@ return ""; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["PsAI*C{QHI3*4?O8p#TM"]; return function* genXYZ () { b0.value = 0; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-warp.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-warp.sb3.tw-snapshot index c70af8ff7e5..d6cbaab4dff 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-warp.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-procedure-return-warp.sb3.tw-snapshot @@ -2,18 +2,14 @@ // Input SHA-256: e652f448fbf09a37afacb03afa9f3448cce43aef06439b58b44aeec73edb0438 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ () { b0.value = 0; while (true) { b0.value = (toNotNaN(+b0.value) + 1); thread.timer = timer(); -var a0 = max(0, 1000 * -1); +var a0 = Math.max(0, 1000 * -1); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -26,10 +22,7 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 3", target); yield* thread.procedures["Znon warp"](); @@ -39,17 +32,13 @@ retire(); return; }; }) // Sprite1 Znon warp -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ_non_warp () { b0.value = 0; for (var a0 = 5; a0 > 0; a0--) { thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a1) { @@ -61,13 +50,13 @@ yield; if ((toNotNaN(+b0.value) === 5)) { runtime.ext_scratch3_looks._say("pass non warp 1", target); } -if ((("" + (yield* thread.procedures["Wverify runs warp %s"]((yield* thread.procedures["Zverify runs non warp %s"]((yield* thread.procedures["Wverify runs warp %s"]("abc"))))))).toLowerCase() === "warp: non warp: warp: abc")) { +if ((("" + (yield* thread.procedures["Wverify runs warp %s"]((yield* thread.procedures["Zverify runs non warp %s"]((yield* thread.procedures["Wverify runs warp %s"]("abc"))))))).toLowerCase() === "warp: non warp: warp: abc".toLowerCase())) { runtime.ext_scratch3_looks._say("pass non warp and warp mix", target); } b0.value = 0; for (var a2 = 5; a2 > 0; a2--) { thread.timer = timer(); -var a3 = max(0, 1000 * 0); +var a3 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a3) { @@ -83,17 +72,13 @@ return ""; }; }) // Sprite1 Wverify runs warp %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ_verify_runs_warp_ (p0) { b0.value = 0; for (var a0 = 5; a0 > 0; a0--) { thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); while (thread.timer.timeElapsed() < a1) { if (isStuck()) yield; @@ -109,17 +94,13 @@ return ""; }; }) // Sprite1 Zverify runs non warp %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Go=PJS7BFXYo_qi2S:kQ"]; return function* genXYZ_verify_runs_non_warp (p0) { b0.value = 0; for (var a0 = 5; a0 > 0; a0--) { thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a1) { diff --git a/test/snapshot/__snapshots__/warp-timer/tw-promise-loop-double-yield-kouzeru.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-promise-loop-double-yield-kouzeru.sb3.tw-snapshot index 72021d15607..608f12c0515 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-promise-loop-double-yield-kouzeru.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-promise-loop-double-yield-kouzeru.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: f8c5c7c3ba1afbd140646e67d9987964cdcdf0cb30b53a0f6276b11f460e7d25 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["JbF5exWEi*m?-UEmkASS"]; const b1 = stage.variables["[G/@.KGc-4y[(GZ(bt7o"]; const b2 = runtime.getOpcodeFunction("sound_seteffectto"); @@ -24,11 +21,7 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["[G/@.KGc-4y[(GZ(bt7o"]; const b1 = stage.variables["JbF5exWEi*m?-UEmkASS"]; return function* genXYZ () { @@ -41,7 +34,7 @@ b1.value = 50; b1.value = 200; } thread.timer = timer(); -var a1 = max(0, 1000 * 0); +var a1 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a1) { diff --git a/test/snapshot/__snapshots__/warp-timer/tw-repeat-analysis-doesnt-reanalyze.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-repeat-analysis-doesnt-reanalyze.sb3.tw-snapshot new file mode 100644 index 00000000000..e0cb864a348 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-repeat-analysis-doesnt-reanalyze.sb3.tw-snapshot @@ -0,0 +1,28 @@ +// TW Snapshot +// Input SHA-256: 38075839898d1ba3d2556f350ff18438a205c5b6b3cb809d07d3f738bd37dad9 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +yield* thread.procedures["Wa"](); +if ((("" + b0.value).toLowerCase() === "bwah".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Wa +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = stage.variables["6h7bpiz0`;;x^G1B3(%["]; +return function* genXYZ_a () { +b0.value = b1.value.length; +for (var a0 = b0.value; a0 > 0; a0--) { +b0.value = "bwah"; +if (isStuck()) yield; +} +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-repeat-procedure-reporter-infinite-analyzer-loop.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-repeat-procedure-reporter-infinite-analyzer-loop.sb3.tw-snapshot new file mode 100644 index 00000000000..6755ac7e301 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-repeat-procedure-reporter-infinite-analyzer-loop.sb3.tw-snapshot @@ -0,0 +1,29 @@ +// TW Snapshot +// Input SHA-256: a12680688ca945364abe1e094b35cf53326f70189cb09b58d5f52b4de0c3b2a9 + +// Text script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 0", target); +yield* thread.procedures["Wtest 1"](); +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Text Wtest 1 +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = target.variables["ts-.PQ{/]mN_9@MbG:m/"]; +return function* genXYZ_test_1 () { +for (var a0 = toNotNaN(+thread.procedures["Wany procedure reporter"]()); a0 >= 0.5; a0--) { +b0.value = (toNotNaN(+b0.value) + 1); +if (isStuck()) yield; +} +return ""; +}; }) + +// Text Wany procedure reporter +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +return function funXYZ_any_procedure_report () { +return 0; +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-repeat-until-false-item-from-list.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-repeat-until-false-item-from-list.sb3.tw-snapshot new file mode 100644 index 00000000000..aca5b04ea85 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-repeat-until-false-item-from-list.sb3.tw-snapshot @@ -0,0 +1,25 @@ +// TW Snapshot +// Input SHA-256: 28253e645679b429a494dbf17b831edc86513cd417cf2c24c9565cacc29a8817 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["aN^sIH)1L`YhdGV*_C5P"]; +const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +b0.value = []; +b0.value.push(("fal" + "se")); +b0._monitorUpToDate = false; +b0.value.push((1 === 1)); +b0._monitorUpToDate = false; +b1.value = 1; +while (!toBoolean(listGet(b0.value, b1.value))) { +b1.value = (toNotNaN(+b1.value) + 1); +yield; +} +if ((toNotNaN(+b1.value) === 2)) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-restart-broadcast-threads.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-restart-broadcast-threads.sb3.tw-snapshot index 91cb0a7eb4d..8da7bc06f09 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-restart-broadcast-threads.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-restart-broadcast-threads.sb3.tw-snapshot @@ -2,11 +2,7 @@ // Input SHA-256: 128cc735fefc374c5935e2c3d9c28b7d07c03d58cd0d6abec4e879c41f4afb1c // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); @@ -14,7 +10,7 @@ b0.value = 0; startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "message1" }); startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "message1" }); thread.timer = timer(); -var a0 = max(0, 1000 * 0); +var a0 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -29,10 +25,7 @@ retire(); return; }; }) // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { b0.value = (toNotNaN(+b0.value) + 1); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-rotate-by-decimal-without-leading-zero.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-rotate-by-decimal-without-leading-zero.sb3.tw-snapshot new file mode 100644 index 00000000000..27fd3590b47 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-rotate-by-decimal-without-leading-zero.sb3.tw-snapshot @@ -0,0 +1,16 @@ +// TW Snapshot +// Input SHA-256: 0a7a3ee1aac2ba5b063f53b742ef992e395ee668efa9205279f93f1949e8a755 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +target.setDirection(90); +target.setDirection((target.direction + 0.25)); +target.setDirection((target.direction + 0.25)); +if ((target.direction === 90.5)) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-safe-procedure-argument-casting.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-safe-procedure-argument-casting.sb3.tw-snapshot index a26c822950f..98631100e00 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-safe-procedure-argument-casting.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-safe-procedure-argument-casting.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 89920bf89edf85596d13e7781c1ea5de2fea61c0adf78ecdd41e4a7ab824aebe // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 2", target); thread.procedures["Zswitch %s"]("1"); @@ -21,10 +18,7 @@ retire(); return; }; }) // Sprite1 Zswitch %s -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function funXYZ_switch_ (p0) { runtime.ext_scratch3_looks._setCostume(target, p0); return ""; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-self-restarting-script-keeps-running-until-yield.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-self-restarting-script-keeps-running-until-yield.sb3.tw-snapshot index 50a840a2a55..accaed1f172 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-self-restarting-script-keeps-running-until-yield.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-self-restarting-script-keeps-running-until-yield.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: dc029abbf128cea0830f4578e89619949837ec26dfa76f110ca599a9ee12e66e // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["G{NQ*NXG*qzywe1Q3?FM"]; const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { @@ -17,10 +14,7 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; const b1 = stage.variables["G{NQ*NXG*qzywe1Q3?FM"]; return function* genXYZ () { diff --git a/test/snapshot/__snapshots__/warp-timer/tw-sensing-of-non-existent-costume-name.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-sensing-of-non-existent-costume-name.sb3.tw-snapshot new file mode 100644 index 00000000000..b8c983bd5b1 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-sensing-of-non-existent-costume-name.sb3.tw-snapshot @@ -0,0 +1,13 @@ +// TW Snapshot +// Input SHA-256: c3b1a45369f15f6809142ef2a2c6d1a680b802b70524a499b347af1008730a03 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = runtime.getSpriteTargetByName("Sprite2"); +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 0", target); +if ((("" + (b0 ? b0.getCostumes()[b0.currentCostume].name : 0)).toLowerCase() === "a".toLowerCase())) { +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-sensing-of.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-sensing-of.sb3.tw-snapshot index 416da48278f..b574fe72392 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-sensing-of.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-sensing-of.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 2086fa5dfdd5f98dcafc01064231a018edb5698b3b4cc403a9cfaeabb5125c06 // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage && stage.lookupVariableByNameAndType("Stage variable", "", true); const b1 = runtime.getSpriteTargetByName("Test sprite"); const b2 = b1 && b1.lookupVariableByNameAndType("Private variable", "", true); @@ -17,13 +14,13 @@ runtime.ext_scratch3_looks._say("plan 32", target); if (((stage.currentCostume + 1) === 2)) { runtime.ext_scratch3_looks._say("pass backdrop #", target); } -if ((("" + stage.getCostumes()[stage.currentCostume].name).toLowerCase() === "backdrop name test")) { +if ((stage.getCostumes()[stage.currentCostume].name.toLowerCase() === "Backdrop name test".toLowerCase())) { runtime.ext_scratch3_looks._say("pass backdrop name", target); } if (((stage ? stage.volume : 0) === 45)) { runtime.ext_scratch3_looks._say("pass stage volume", target); } -if ((("" + (b0 ? b0.value : 0)).toLowerCase() === "variable in stage")) { +if ((("" + (b0 ? b0.value : 0)).toLowerCase() === "Variable in stage".toLowerCase())) { runtime.ext_scratch3_looks._say("pass stage variable", target); } if (((b1 ? b1.x : 0) === 19)) { @@ -38,7 +35,7 @@ runtime.ext_scratch3_looks._say("pass direction", target); if (((b1 ? b1.currentCostume + 1 : 0) === 3)) { runtime.ext_scratch3_looks._say("pass costume #", target); } -if ((("" + (b1 ? b1.getCostumes()[b1.currentCostume].name : 0)).toLowerCase() === "costume name test")) { +if ((("" + (b1 ? b1.getCostumes()[b1.currentCostume].name : 0)).toLowerCase() === "Costume name test".toLowerCase())) { runtime.ext_scratch3_looks._say("pass costume name", target); } if (((b1 ? b1.size : 0) === 76.01)) { @@ -47,7 +44,7 @@ runtime.ext_scratch3_looks._say("pass size", target); if (((b1 ? b1.volume : 0) === 14.3)) { runtime.ext_scratch3_looks._say("pass volume", target); } -if ((("" + (b2 ? b2.value : 0)).toLowerCase() === "private variable value")) { +if ((("" + (b2 ? b2.value : 0)).toLowerCase() === "Private variable value".toLowerCase())) { runtime.ext_scratch3_looks._say("pass private variable", target); } if (compareEqual((b3 ? b3.value : 0), 0)) { @@ -90,25 +87,25 @@ runtime.ext_scratch3_looks._say("pass NE volume", target); if (compareEqual(runtime.ext_scratch3_sensing.getAttributeOf({OBJECT: b4.value, PROPERTY: "Private variable" }), 0)) { runtime.ext_scratch3_looks._say("pass NE private variable", target); } -if (compareEqual((b5 ? b5.x : 0), 0)) { +if (((b5 ? b5.x : 0) === 0)) { runtime.ext_scratch3_looks._say("pass NE backdrop #", target); } -if (compareEqual((b5 ? b5.y : 0), 0)) { +if (((b5 ? b5.y : 0) === 0)) { runtime.ext_scratch3_looks._say("pass NE backdrop name", target); } -if (compareEqual((b5 ? b5.direction : 0), 0)) { +if (((b5 ? b5.direction : 0) === 0)) { runtime.ext_scratch3_looks._say("pass NE volume", target); } -if (compareEqual((b5 ? b5.currentCostume + 1 : 0), 0)) { +if (((b5 ? b5.currentCostume + 1 : 0) === 0)) { runtime.ext_scratch3_looks._say("pass NE stage variable", target); } if (compareEqual((b5 ? b5.getCostumes()[b5.currentCostume].name : 0), 0)) { runtime.ext_scratch3_looks._say("pass NE x", target); } -if (compareEqual((b5 ? b5.size : 0), 0)) { +if (((b5 ? b5.size : 0) === 0)) { runtime.ext_scratch3_looks._say("pass NE y", target); } -if (compareEqual((b5 ? b5.volume : 0), 0)) { +if (((b5 ? b5.volume : 0) === 0)) { runtime.ext_scratch3_looks._say("pass NE direction", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-simple-string-operations.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-simple-string-operations.sb3.tw-snapshot new file mode 100644 index 00000000000..e0a9fa06438 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-simple-string-operations.sb3.tw-snapshot @@ -0,0 +1,36 @@ +// TW Snapshot +// Input SHA-256: e6a6f5ea252886949eab2f4b5608526dc3686160d65f6e07c2d864c82db24326 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["PJl9-2GypE.OstQk*B_*"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +yield* thread.procedures["Wa"](); +if ((("" + b0.value).toLowerCase() === "babab".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Wa +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["uEt-Ix{%|r3`}-W%+kdm"]; +const b1 = stage.variables["PJl9-2GypE.OstQk*B_*"]; +const b2 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ_a () { +b0.value = "ababa"; +b1.value = ""; +b2.value = 1; +for (var a0 = b0.value.length; a0 > 0; a0--) { +if ((((("" + b0.value))[((+b2.value) | 0) - 1] || "").toLowerCase() === "a".toLowerCase())) { +b1.value = (("" + b1.value) + "b"); +} else { +b1.value = (("" + b1.value) + "a"); +} +b2.value = (toNotNaN(+b2.value) + 1); +if (isStuck()) yield; +} +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-sound-menu-avoids-number-literal-if-name-conflict.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-sound-menu-avoids-number-literal-if-name-conflict.sb3.tw-snapshot new file mode 100644 index 00000000000..69eaca7f0d6 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-sound-menu-avoids-number-literal-if-name-conflict.sb3.tw-snapshot @@ -0,0 +1,20 @@ +// TW Snapshot +// Input SHA-256: 91090a2de3ee7db914230fa0aa354e89d6b1781b5a730a71986b018b5f217f18 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 2", target); +b0.value = "5"; +runtime.ext_scratch3_looks._setCostume(target, "costume1"); +if (((target.currentCostume + 1) === 1)) { +runtime.ext_scratch3_looks._say("pass initial costume", target); +} +runtime.ext_scratch3_looks._setCostume(target, b0.value); +if (((target.currentCostume + 1) === 3)) { +runtime.ext_scratch3_looks._say("pass costume \"5\"", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-stage-cannot-move-layers.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-stage-cannot-move-layers.sb3.tw-snapshot index 30d845e8cdc..685797599df 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-stage-cannot-move-layers.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-stage-cannot-move-layers.sb3.tw-snapshot @@ -2,17 +2,13 @@ // Input SHA-256: 5592b1a64924003352fa3d2d9157c797689a702f55ba39c73a5e0bc862f57e59 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); -const max=Math.max; +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); b0.value = "Initial"; thread.timer = timer(); -var a0 = max(0, 1000 * 0); +var a0 = Math.max(0, 1000 * 0); runtime.requestRedraw(); yield; while (thread.timer.timeElapsed() < a0) { @@ -25,32 +21,23 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { -if ((("" + b0.value).toLowerCase() === "initial")) { +if ((("" + b0.value).toLowerCase() === "Initial".toLowerCase())) { runtime.ext_scratch3_looks._say("pass", target); } retire(); return; }; }) // Stage script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { retire(); return; }; }) // Stage script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = target.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; return function* genXYZ () { b0.value = "Stage callback"; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-state-analysis-understands-stop-this-script.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-state-analysis-understands-stop-this-script.sb3.tw-snapshot new file mode 100644 index 00000000000..0078fee3bd0 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-state-analysis-understands-stop-this-script.sb3.tw-snapshot @@ -0,0 +1,29 @@ +// TW Snapshot +// Input SHA-256: 7f99a41ef716935ae486087d8adf955cbd853c893bc94e58e4cc1c46ad1a7883 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["KMKx1gRubgLz,!L]^TBS"]; +const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +thread.procedures["Wtest"](); +if ((("" + listGet(b0.value, b1.value)).toLowerCase() === "thing".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Wtest +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["yz}9Y:gLL0ZWEs}l)s+Q"]; +const b1 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function funXYZ_test () { +if ((("" + b0.value).toLowerCase() === "true".toLowerCase())) { +b1.value = "last"; +return ""; +} +b1.value = (1 + 2); +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-subtract-can-return-nan.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-subtract-can-return-nan.sb3.tw-snapshot index 848f9080f9d..d48db9ac3fa 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-subtract-can-return-nan.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-subtract-can-return-nan.sb3.tw-snapshot @@ -2,13 +2,12 @@ // Input SHA-256: f54b97baf31500c1b6bd5b9865ce96b8aeef1001169bbe4550bbcbff84f2dae6 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); +if (!((Infinity - Infinity) <= 0)) { runtime.ext_scratch3_looks._say("pass", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-tab-equals-zero.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-tab-equals-zero.sb3.tw-snapshot index ffac27c3480..a55f7db71ab 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-tab-equals-zero.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-tab-equals-zero.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 86c1734c101ee85e6f737f891d6ca338d72b17026ab60d289ea7861351c65124 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Kl,Own0m6{^v3$E{Wsc="]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 6", target); @@ -15,24 +12,25 @@ retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["Kl,Own0m6{^v3$E{Wsc="]; return function* genXYZ () { -if (compareEqual(b0.value, 0)) { +if (compareEqual(b0.value, ("0" + ""))) { runtime.ext_scratch3_looks._say("pass \\t in a variable = string 0", target); } +if (compareEqual("\t", ("0" + ""))) { runtime.ext_scratch3_looks._say("pass literal \\t = string 0", target); -if (compareEqual((" " + ("" + b0.value)), 0)) { +} +if (compareEqual((" " + ("" + b0.value)), ("0" + ""))) { runtime.ext_scratch3_looks._say("pass \\t and other spaces = string 0", target); } -if (compareEqual(b0.value, 0)) { +if (compareEqual(b0.value, (0 + 0))) { runtime.ext_scratch3_looks._say("pass \\t in a variable = number 0", target); } +if ((0 === (0 + 0))) { runtime.ext_scratch3_looks._say("pass literal \\t = number 0", target); -if (compareEqual((" " + ("" + b0.value)), 0)) { +} +if (compareEqual((" " + ("" + b0.value)), (0 + 0))) { runtime.ext_scratch3_looks._say("pass \\t and other spaces = number 0", target); } runtime.ext_scratch3_looks._say("end", target); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-tangent-variable.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-tangent-variable.sb3.tw-snapshot index 4c5b566265b..f60a9d66565 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-tangent-variable.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-tangent-variable.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 43dcff5e846d45386f48c6abe43837fd1897103159da213feb9b8283ed63e971 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 4", target); target.setXY(45, 0); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-tangent.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-tangent.sb3.tw-snapshot index 4bf8b2e50ed..0fae46c5922 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-tangent.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-tangent.sb3.tw-snapshot @@ -2,27 +2,54 @@ // Input SHA-256: 1446684578b41ff41cf29fbe14696ef717cca636e8d46babd7d9dec6df723a33 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 15", target); +if (compareEqual(tan(0), 0)) { runtime.ext_scratch3_looks._say("pass 0", target); +} +if ((toNotNaN(tan(90)) === Infinity)) { runtime.ext_scratch3_looks._say("pass 90", target); +} +if (compareEqual(tan(180), 0)) { runtime.ext_scratch3_looks._say("pass 180", target); +} +if ((toNotNaN(tan(270)) === -Infinity)) { runtime.ext_scratch3_looks._say("pass 270", target); +} +if (compareEqual(tan(360), 0)) { runtime.ext_scratch3_looks._say("pass 360", target); +} +if ((toNotNaN(tan(450)) === Infinity)) { runtime.ext_scratch3_looks._say("pass 450", target); +} +if (compareEqual(tan(540), 0)) { runtime.ext_scratch3_looks._say("pass 540", target); +} +if ((toNotNaN(tan(630)) === -Infinity)) { runtime.ext_scratch3_looks._say("pass 630", target); +} +if (compareEqual(tan(720), 0)) { runtime.ext_scratch3_looks._say("pass 720", target); +} +if ((toNotNaN(tan(810)) === Infinity)) { runtime.ext_scratch3_looks._say("pass 810", target); +} +if ((toNotNaN(tan(-90)) === -Infinity)) { runtime.ext_scratch3_looks._say("pass -90", target); +} +if (compareEqual(tan(-180), 0)) { runtime.ext_scratch3_looks._say("pass -180", target); +} +if ((toNotNaN(tan(-270)) === Infinity)) { runtime.ext_scratch3_looks._say("pass -270", target); +} +if (compareEqual(tan(-360), 0)) { runtime.ext_scratch3_looks._say("pass -360", target); +} +if ((toNotNaN(tan(-450)) === -Infinity)) { runtime.ext_scratch3_looks._say("pass -450", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-true-equals-1.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-true-equals-1.sb3.tw-snapshot new file mode 100644 index 00000000000..e4a9a048854 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-true-equals-1.sb3.tw-snapshot @@ -0,0 +1,38 @@ +// TW Snapshot +// Input SHA-256: 70cf221f35f1459c3b81ece31ed7b377098ff26eeafb66eba3788dd82c90bdd5 + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["{vwNMZe-LO,q/k3(A,.`"]; +const b1 = stage.variables["DKX$)W98mALB-eeMoj(d"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 8", target); +if (!("true".toLowerCase() === "1".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +if (!("1".toLowerCase() === "true".toLowerCase())) { +runtime.ext_scratch3_looks._say("pass", target); +} +if (((+(2 === 2)) === 1)) { +runtime.ext_scratch3_looks._say("pass", target); +} +if ((1 === (+(2 === 2)))) { +runtime.ext_scratch3_looks._say("pass", target); +} +b0.value = (2 === 2); +b1.value = ("tr" + "ue"); +if (!(toNotNaN(+b1.value) === 1)) { +runtime.ext_scratch3_looks._say("pass", target); +} +if (!(1 === toNotNaN(+b1.value))) { +runtime.ext_scratch3_looks._say("pass", target); +} +if (((+b0.value) === 1)) { +runtime.ext_scratch3_looks._say("pass", target); +} +if ((1 === (+b0.value))) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-unsafe-equals.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-unsafe-equals.sb3.tw-snapshot index c27b2fea307..35c87417158 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-unsafe-equals.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-unsafe-equals.sb3.tw-snapshot @@ -2,34 +2,35 @@ // Input SHA-256: badd564b5bce22a82223511c91ba701da5314e5ad83e46a08ea5f401a4338b20 // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables[",OktMIwz{~bdgWnPEa8u"]; const b1 = stage.variables["yfy(G`K5K^fJcXAfiN4i"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 14", target); +if ((10 === 10)) { runtime.ext_scratch3_looks._say("pass 1", target); +} +if ((10 === 10)) { runtime.ext_scratch3_looks._say("pass 2", target); +} b0.value = 10; -if ((toNotNaN(+b0.value) === 10)) { +if ((b0.value === 10)) { runtime.ext_scratch3_looks._say("pass 3", target); } -if (compareEqual(b0.value, "010")) { +if ((b0.value === 10)) { runtime.ext_scratch3_looks._say("pass 4", target); } -if (compareEqual(b0.value, "0000000010")) { +if ((b0.value === 10)) { runtime.ext_scratch3_looks._say("pass 5", target); } for (var a0 = 1; a0 > 0; a0--) { if ((toNotNaN(+b0.value) === 10)) { runtime.ext_scratch3_looks._say("pass 6", target); } -if (compareEqual(b0.value, "010")) { +if ((toNotNaN(+b0.value) === 10)) { runtime.ext_scratch3_looks._say("pass 7", target); } -if (compareEqual(b0.value, "0000000010")) { +if ((toNotNaN(+b0.value) === 10)) { runtime.ext_scratch3_looks._say("pass 8", target); } yield; @@ -38,24 +39,45 @@ b1.value = "010"; if ((toNotNaN(+b1.value) === 10)) { runtime.ext_scratch3_looks._say("pass 9", target); } -if (compareEqual(b1.value, "010")) { +if ((toNotNaN(+b1.value) === 10)) { runtime.ext_scratch3_looks._say("pass 10", target); } -if (compareEqual(b1.value, "0000000010")) { +if ((toNotNaN(+b1.value) === 10)) { runtime.ext_scratch3_looks._say("pass 11", target); } for (var a1 = 1; a1 > 0; a1--) { if ((toNotNaN(+b1.value) === 10)) { runtime.ext_scratch3_looks._say("pass 12", target); } -if (compareEqual(b1.value, "010")) { +if ((toNotNaN(+b1.value) === 10)) { runtime.ext_scratch3_looks._say("pass 13", target); } -if (compareEqual(b1.value, "0000000010")) { +if ((toNotNaN(+b1.value) === 10)) { runtime.ext_scratch3_looks._say("pass 14", target); } yield; } +if (("".toLowerCase() === "1".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} +if (("1".toLowerCase() === "".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} +if ((" ".toLowerCase() === "1".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} +if ((" ".toLowerCase() === "0".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} +if (("0".toLowerCase() === " ".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} +if (("".toLowerCase() === "0".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} +if (("0".toLowerCase() === "".toLowerCase())) { +runtime.ext_scratch3_looks._say("fail", target); +} runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-variadic-divide-nan.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-variadic-divide-nan.sb3.tw-snapshot index e42bf6bc7a7..54ac1d1dfc4 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-variadic-divide-nan.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-variadic-divide-nan.sb3.tw-snapshot @@ -2,26 +2,24 @@ // Input SHA-256: 08f68e9596033cbccc0ceef75cb1c105f167293e03bb42363de679bb09d280e7 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = runtime.getOpcodeFunction("operator_divide"); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 3", target); target.setXY(0, 0); -if (compareEqual((toNotNaN((toNotNaN((0 / limitPrecision(target.x))) / 0)) / 3), 0)) { +if (compareEqual((yield* executeInCompatibilityLayer({"NUM1":"","NUM2":limitPrecision(target.x),"NUM3":"abc","NUM4":3,"mutation":{"tagName":"mutation","children":[],"itemcount":"4"},}, b0, false, false, "d0", null)), 0)) { runtime.ext_scratch3_looks._say("pass div 0", target); } else { runtime.ext_scratch3_looks._say("fail div 0 (want 0)", target); } target.setXY(6, 0); -if (((toNotNaN((toNotNaN((12 / limitPrecision(target.x))) / 0)) / 2) === Infinity)) { +if ((toNotNaN(+(yield* executeInCompatibilityLayer({"NUM1":12,"NUM2":limitPrecision(target.x),"NUM3":"q","NUM4":2,"mutation":{"tagName":"mutation","children":[],"itemcount":"4"},}, b0, false, false, "d1", null))) === Infinity)) { runtime.ext_scratch3_looks._say("pass div 1", target); } else { runtime.ext_scratch3_looks._say("fail div 1 (want Infinity)", target); } target.setXY(4, 0); -if (((toNotNaN((8 / limitPrecision(target.x))) / 2) === 1)) { +if ((toNotNaN(+(yield* executeInCompatibilityLayer({"NUM1":8,"NUM2":limitPrecision(target.x),"NUM3":2,"mutation":{"tagName":"mutation","children":[],"itemcount":"3"},}, b0, false, false, "d2", null))) === 1)) { runtime.ext_scratch3_looks._say("pass div 2", target); } else { runtime.ext_scratch3_looks._say("fail div 2 (want 1)", target); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-wait-until-condition-gh-277.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-wait-until-condition-gh-277.sb3.tw-snapshot new file mode 100644 index 00000000000..02b2fc4738c --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-wait-until-condition-gh-277.sb3.tw-snapshot @@ -0,0 +1,33 @@ +// TW Snapshot +// Input SHA-256: 2422e407892596fbf410e032196131f9bae718563fd80b1ff32cf972859c034b + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 0", target); +startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "message1" }); +b0.value = "bwah"; +while (!(("" + b0.value).toLowerCase() === "bleh".toLowerCase())) { +yield; +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +return function* genXYZ () { +b0.value = (1 + 2); +thread.timer = timer(); +var a0 = Math.max(0, 1000 * 0); +runtime.requestRedraw(); +yield; +while (thread.timer.timeElapsed() < a0) { +yield; +} +thread.timer = null; +b0.value = "bleh"; +retire(); return; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-warp-loop-condition-analysis.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-warp-loop-condition-analysis.sb3.tw-snapshot new file mode 100644 index 00000000000..07d15df6d08 --- /dev/null +++ b/test/snapshot/__snapshots__/warp-timer/tw-warp-loop-condition-analysis.sb3.tw-snapshot @@ -0,0 +1,39 @@ +// TW Snapshot +// Input SHA-256: 95d4c128e84ee992b48ed20653ba70b0f6c2d404c4f7088fa654676cd6b7c53c + +// Sprite1 script +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables[";~q(!vt3c.Jrz2M]ZMy]"]; +const b1 = stage.variables[",23fjp~KN1aMG|;66K@Z"]; +return function* genXYZ () { +runtime.ext_scratch3_looks._say("plan 1", target); +b0.value = []; +b0.value.push((1 + 2)); +b0._monitorUpToDate = false; +b0.value.push((3 + 4)); +b0._monitorUpToDate = false; +b0.value.push("final"); +b0._monitorUpToDate = false; +yield* thread.procedures["Wtest"](); +if ((toNotNaN(+b1.value) === 4)) { +runtime.ext_scratch3_looks._say("pass", target); +} +runtime.ext_scratch3_looks._say("end", target); +retire(); return; +}; }) + +// Sprite1 Wtest +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); +const b0 = stage.variables["`jEk@4|i[#Fk?(8x)AV.-my variable"]; +const b1 = stage.variables[",23fjp~KN1aMG|;66K@Z"]; +const b2 = stage.variables[";~q(!vt3c.Jrz2M]ZMy]"]; +return function* genXYZ_test () { +b0.value = ""; +b1.value = 1; +while (!(("" + b0.value).toLowerCase() === "final".toLowerCase())) { +b0.value = listGet(b2.value, b1.value); +b1.value = (toNotNaN(+b1.value) + 1); +if (isStuck()) yield; +} +return ""; +}; }) diff --git a/test/snapshot/__snapshots__/warp-timer/tw-warp-repeat-until-timer-greater-than.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-warp-repeat-until-timer-greater-than.sb3.tw-snapshot index 62c334a968d..90dd7011df2 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-warp-repeat-until-timer-greater-than.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-warp-repeat-until-timer-greater-than.sb3.tw-snapshot @@ -2,10 +2,7 @@ // Input SHA-256: 2ae215411916e72c845c0f613d5b93f017b16af3010c6f4b0bbb3d1087eec301 // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); yield* thread.procedures["Wrun without screen refresh"](); @@ -14,13 +11,10 @@ retire(); return; }; }) // Sprite1 Wrun without screen refresh -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["F?*}X,`9XBpN_[piGRrz"]; return function* genXYZ_run_without_screen_r () { -b0.value = (toNotNaN((daysSince2000() * 86400)) + 3); +b0.value = ((daysSince2000() * 86400) + 3); runtime.ioDevices.clock.resetProjectTimer(); while (!((runtime.ioDevices.clock.projectTimer() > 0.1) || compareGreaterThan((daysSince2000() * 86400), b0.value))) { if (isStuck()) yield; diff --git a/test/snapshot/__snapshots__/warp-timer/tw-when-backdrop-switches-to-next-backdrop.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-when-backdrop-switches-to-next-backdrop.sb3.tw-snapshot index e4c67f60056..8b5cdd42bd8 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-when-backdrop-switches-to-next-backdrop.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-when-backdrop-switches-to-next-backdrop.sb3.tw-snapshot @@ -2,20 +2,14 @@ // Input SHA-256: ae6b920864ec07bc5a36b4af493b1646e54241abadabfa7bf962b43610ad926d // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 0", target); runtime.ext_scratch3_looks._setBackdrop(stage, stage.currentCostume + 1, true); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-when-backdrop-switches-to-switch-backdrop-to.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-when-backdrop-switches-to-switch-backdrop-to.sb3.tw-snapshot index fc615070f27..a6ef03ebdb4 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-when-backdrop-switches-to-switch-backdrop-to.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-when-backdrop-switches-to-switch-backdrop-to.sb3.tw-snapshot @@ -2,20 +2,14 @@ // Input SHA-256: 503e54070a6a749f8ffbcfad08d64cff3c1abb9400a7519b623b3876bd97e54a // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("end", target); retire(); return; }; }) // Sprite1 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 0", target); runtime.ext_scratch3_looks._setBackdrop(stage, "backdrop2"); diff --git a/test/snapshot/__snapshots__/warp-timer/tw-zombie-cube-escape-284516654.sb3.tw-snapshot b/test/snapshot/__snapshots__/warp-timer/tw-zombie-cube-escape-284516654.sb3.tw-snapshot index 81566429f6b..7ed5bde1fc6 100644 --- a/test/snapshot/__snapshots__/warp-timer/tw-zombie-cube-escape-284516654.sb3.tw-snapshot +++ b/test/snapshot/__snapshots__/warp-timer/tw-zombie-cube-escape-284516654.sb3.tw-snapshot @@ -2,17 +2,14 @@ // Input SHA-256: 6fe809479042e5ba09d66bffbd62d5a38d2265c98818e937d63137d2dcdc2fec // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["7qur6!bGgvC9I(Nd5.HP"]; const b1 = stage.variables["sUOp@-6J4y0PqwiXit4!"]; return function* genXYZ () { runtime.ext_scratch3_looks._say("plan 1", target); b0.value = 0; b1.value = ""; -while (!compareGreaterThan(b1.value, "")) { +while (!(("" + b1.value).toLowerCase() > "".toLowerCase())) { startHats("event_whenbroadcastreceived", { BROADCAST_OPTION: "step" }); yield; } @@ -22,10 +19,7 @@ retire(); return; }; }) // Sprite2 script -(function factoryXYZ(thread) { -const target = thread.target; -const runtime = target.runtime; -const stage = runtime.getTargetForStage(); +(function factoryXYZ(thread) { const target = thread.target; const runtime = target.runtime; const stage = runtime.getTargetForStage(); const b0 = stage.variables["7qur6!bGgvC9I(Nd5.HP"]; const b1 = stage.variables["sUOp@-6J4y0PqwiXit4!"]; return function* genXYZ () { diff --git a/test/unit/blocks_data.js b/test/unit/blocks_data.js index 01980434d69..00cbfc3a613 100644 --- a/test/unit/blocks_data.js +++ b/test/unit/blocks_data.js @@ -47,3 +47,15 @@ test('getItemNumOfList uses Scratch comparison', t => { t.end(); }); + +test('case-sensitive list option uses exact matches', t => { + const exactBlocks = new Data({runtimeOptions: {caseSensitiveLists: true}}); + lists.list = {value: ['jump', 'Jump']}; + const args = {ITEM: 'Jump', LIST: {name: 'list'}}; + + t.equal(exactBlocks.getItemNumOfList(args, util), 2); + t.equal(exactBlocks.listContainsItem(args, util), true); + args.ITEM = 'JUMP'; + t.equal(exactBlocks.listContainsItem(args, util), false); + t.end(); +}); diff --git a/test/unit/blocks_looks.js b/test/unit/blocks_looks.js index 0a772f04ed4..7977e17767b 100644 --- a/test/unit/blocks_looks.js +++ b/test/unit/blocks_looks.js @@ -181,6 +181,11 @@ test('getCostumeNumberName can return costume name', t => { t.end(); }); +test('getCostumes returns costume names as JSON', t => { + t.equal(blocks.getCostumes({}, util), '["first name","second name","third name"]'); + t.end(); +}); + test('getBackdropNumberName returns 1-indexed costume number', t => { util.target.currentCostume = 2; // This is 0-indexed. const args = {NUMBER_NAME: 'number'}; diff --git a/test/unit/blocks_motion.js b/test/unit/blocks_motion.js index 09bcd22bbe3..a0913a777cf 100644 --- a/test/unit/blocks_motion.js +++ b/test/unit/blocks_motion.js @@ -24,3 +24,16 @@ test('Coordinates have limited precision', t => { t.equals(motion.getY({}, util), 1); t.end(); }); + +test('point towards from uses both coordinate pairs', t => { + const rt = new Runtime(); + const motion = new Motion(rt); + const sprite = new Sprite(null, rt); + const target = new RenderedTarget(sprite, rt); + + target.setXY(0, -10); + motion.pointTowards_xyfrom({X: 10, Y: 10, FROMX: 0, FROMY: 0}, {target}); + + t.equal(target.direction, 45); + t.end(); +}); diff --git a/test/unit/blocks_operators.js b/test/unit/blocks_operators.js index b670e11d350..e5bb3d78d85 100644 --- a/test/unit/blocks_operators.js +++ b/test/unit/blocks_operators.js @@ -32,6 +32,13 @@ test('divide', t => { t.end(); }); +test('MistWarp numeric helpers', t => { + t.strictEqual(blocks.clamp({NUM: 12, MIN: 0, MAX: 10}), 10); + t.strictEqual(blocks.min({NUM1: 8, NUM2: 3, NUM3: 5, mutation: {itemcount: 3}}), 3); + t.strictEqual(blocks.max({NUM1: 8, NUM2: 3, NUM3: 12, mutation: {itemcount: 3}}), 12); + t.end(); +}); + test('lt', t => { t.strictEqual(blocks.lt({OPERAND1: '1', OPERAND2: '2'}), true); t.strictEqual(blocks.lt({OPERAND1: '2', OPERAND2: '1'}), false); diff --git a/test/unit/compiler.js b/test/unit/compiler.js deleted file mode 100644 index 83cc640ab89..00000000000 --- a/test/unit/compiler.js +++ /dev/null @@ -1,231 +0,0 @@ -const test = require('tap').test; - -const VariablePool = require('../../src/compiler/variable-pool'); -const compatBlocks = require('../../src/compiler/compat-blocks'); -const CompatBlockUtility = require('../../src/compiler/compat-block-utility'); -const IR = require('../../src/compiler/intermediate'); -const {BLOCKS} = require('../../src/compiler/enums'); -const {ScriptTreeGenerator} = require('../../src/compiler/irgen'); -const JSGenerator = require('../../src/compiler/jsgen'); -const {IROptimizer} = require('../../src/compiler/iroptimizer'); -const execute = require('../../src/compiler/jsexecute'); - -test('VariablePool basic', t => { - t.throws(() => new VariablePool(' '), { message: /prefix cannot be empty/ }); - const p = new VariablePool('v'); - t.equal(p.next(), 'v0'); - t.equal(p.next(), 'v1'); - t.end(); -}); - -test('compat-blocks exports arrays', t => { - t.ok(Array.isArray(compatBlocks.stacked)); - t.ok(Array.isArray(compatBlocks.inputs)); - // sanity check a couple known entries - t.ok(compatBlocks.stacked.indexOf('sound_play') !== -1); - t.ok(compatBlocks.inputs.indexOf('sound_volume') !== -1); - t.end(); -}); - -test('strings category compiles without the compatibility layer', t => { - const runtime = { - compilerOptions: {warpTimer: false}, - getTargetForStage: () => null, - targets: [] - }; - const target = {runtime}; - const tree = new ScriptTreeGenerator({target, blockContainer: {}}); - tree.descendInputOfBlock = (_block, name) => ({kind: BLOCKS.CONSTANT, value: name}); - const script = new IR.IntermediateScript(); - const js = new JSGenerator(script, new IR.IntermediateRepresentation(script), target); - - for (const [opcode, kind] of [ - ['operator_change_case', BLOCKS.OP.CHANGECASE], - ['operator_contains', BLOCKS.OP.CONTAINS], - ['operator_index_of', BLOCKS.OP.INDEXOF], - ['operator_join', BLOCKS.OP.JOIN], - ['operator_length', BLOCKS.OP.LENGTH], - ['operator_letter_of', BLOCKS.OP.LETTEROF], - ['operator_letters_of', BLOCKS.OP.LETTERSOF], - ['operator_newline', BLOCKS.CONSTANT], - ['operator_repeat', BLOCKS.OP.REPEAT], - ['operator_replace', BLOCKS.OP.REPLACE], - ['operator_trim', BLOCKS.OP.TRIM] - ]) { - const node = tree.descendInput({opcode, inputs: {}, fields: {CASE: {value: 'uppercase'}}}); - t.equal(node.kind, kind, opcode); - t.notMatch(js.descendInput(node).source, /executeInCompatibilityLayer|ext_scratch3_operators/, opcode); - } - t.doesNotThrow(() => execute.scopedEval(js.createScriptFactory()), 'generated helpers are valid JavaScript'); - t.end(); -}); - -test('JSON extension compiles to native typed values', t => { - const runtime = { - compilerOptions: {warpTimer: false}, - getTargetForStage: () => null, - targets: [], - ext_skyhigh173JSON: { - json_vm_setlist: (args, util) => { util.target.list = args.list; } - } - }; - const target = {runtime}; - const tree = new ScriptTreeGenerator({target, blockContainer: {}}); - const values = {json: '{"a":1}', item: 'b', value: 2, list: 'list-id'}; - tree.descendInputOfBlock = (_block, name) => ({kind: BLOCKS.CONSTANT, value: values[name]}); - const script = new IR.IntermediateScript(); - const js = new JSGenerator(script, new IR.IntermediateRepresentation(script), target); - const block = opcode => ({opcode, inputs: values, fields: {}}); - - const setNode = tree.descendInput(block('skyhigh173JSON_json_set')); - const setInput = js.descendInput(setNode); - t.equal(setNode.kind, BLOCKS.EXTENSION); - t.equal(setInput.type, JSGenerator.unstable_exports.TYPE_JSON); - t.notMatch(setInput.source, /yield|Compatibility/); - t.notMatch(setInput.source, /runtime\.ext_/); - const helpers = () => [...js.prependFunctions.values()].join(';\n'); - const evaluate = source => execute.scopedEval(`(() => {${helpers()}; return ${source};})()`); - t.same(evaluate(setInput.source), {a: 1, b: 2}, 'known JSON stays native'); - t.equal(setInput.asJSON(), setInput.source, 'JSON inputs reuse the native value'); - t.equal(evaluate(setInput.asString()), '{"a":1,"b":2}', 'ordinary inputs stringify JSON'); - - const lengthInput = js.descendInput({ - kind: BLOCKS.EXTENSION, - opcode: 'skyhigh173JSON_json_jlength', - inputs: {json: setNode}, - fields: {} - }); - t.equal(evaluate(lengthInput.source), 2, 'native JSON operations compose'); - t.notMatch(lengthInput.source, /toScratchString|JSON\.stringify/, 'nested JSON stays native'); - - const getInput = js.descendInput({ - kind: BLOCKS.EXTENSION, - opcode: 'skyhigh173JSON_json_get', - inputs: { - json: {kind: BLOCKS.CONSTANT, value: '{"nested":{"x":1}}'}, - item: {kind: BLOCKS.CONSTANT, value: 'nested'} - }, - fields: {} - }); - t.same(evaluate(getInput.source), {x: 1}, 'get can return native JSON'); - t.equal(evaluate(getInput.asString()), '{"x":1}', 'dynamic JSON stringifies at the boundary'); - t.equal(evaluate(getInput.asUnknown()), '{"x":1}', 'raw block boundaries stringify nested JSON'); - - const booleanInput = js.descendInput(tree.descendInput(block('skyhigh173JSON_json_is_valid'))); - t.equal(booleanInput.type, JSGenerator.unstable_exports.TYPE_BOOLEAN); - - const unknownInput = new JSGenerator.unstable_exports.TypedInput( - 'callback', JSGenerator.unstable_exports.TYPE_UNKNOWN - ); - t.equal(unknownInput.asUnknown(), 'callback', 'unknown values can carry functions without stringifying'); - - const getAllInput = js.descendInput({ - kind: BLOCKS.EXTENSION, - opcode: 'skyhigh173JSON_json_get_all', - inputs: {json: {kind: BLOCKS.CONSTANT, value: '{"a":1}'}}, - fields: {STYPE: 'keys'} - }); - t.same(evaluate(getAllInput.source), ['a'], 'extension menu fields are accepted case-insensitively'); - - const getAllWithoutMenu = js.descendInput({ - kind: BLOCKS.EXTENSION, - opcode: 'skyhigh173JSON_json_get_all', - inputs: {json: {kind: BLOCKS.CONSTANT, value: '{"a":1}'}}, - fields: {} - }); - t.same(evaluate(getAllWithoutMenu.source), [], 'missing extension inputs compile with an empty fallback'); - - tree.thread.stackClick = true; - const visualReport = tree.descendStackedBlock(block('skyhigh173JSON_json_set')); - t.equal(visualReport.kind, BLOCKS.VISUAL_REPORT); - js.descendStackedBlock(visualReport); - js.descendStackedBlock(tree.descendStackedBlock(block('skyhigh173JSON_json_vm_setlist'))); - t.match(js.source, /runtime\.visualReport/); - t.match(js.source, /json_vm_setlist\(.+, \{target\}\)/); - t.doesNotThrow(() => execute.scopedEval(js.createScriptFactory()), 'visual reporters generate valid JavaScript'); - - delete runtime.ext_skyhigh173JSON; - runtime.getOpcodeFunction = () => () => {}; - runtime._blockInfo = [{ - id: 'skyhigh173JSON', - blocks: [{info: {opcode: 'json_array_reverse', blockType: 'reporter'}}] - }]; - t.equal(tree.descendInput(block('skyhigh173JSON_json_get_all')).kind, BLOCKS.EXTENSION, - 'native block does not require an extension instance'); - t.equal(tree.descendInput(block('skyhigh173JSON_json_array_reverse')).kind, BLOCKS.COMPAT, - 'unavailable extension instance uses compatibility layer'); - t.end(); -}); - -test('IntermediateScript defaults', t => { - const s = new IR.IntermediateScript(); - t.equal(s.topBlockId, null); - t.equal(s.isProcedure, false); - t.equal(s.yields, true); - const ir = new IR.IntermediateRepresentation(); - t.equal(ir.entry, null); - t.same(ir.procedures, {}); - t.end(); -}); - -test('CompatibilityLayerBlockUtility behavior', t => { - t.throws(() => CompatBlockUtility.startProcedure(), /not supported/); - t.throws(() => CompatBlockUtility.initParams(), /not supported/); - t.throws(() => CompatBlockUtility.pushParam(), /not supported/); - t.throws(() => CompatBlockUtility.getParam(), /not supported/); - // startBranch should set internal state - CompatBlockUtility.startBranch(2, true); - t.same(CompatBlockUtility._startedBranch, [2, true]); - t.end(); -}); - -test('jsexecute helpers: boolean, precision, compare, list ops, math', t => { - // toBoolean - t.equal(execute.scopedEval('toBoolean(true)'), true); - t.equal(execute.scopedEval("toBoolean('0')"), false); - t.equal(execute.scopedEval("toBoolean('false')"), false); - - // limitPrecision - t.equal(execute.scopedEval('limitPrecision(1.0000000001)'), 1); - t.equal(execute.scopedEval('limitPrecision(1.0001)'), 1.0001); - - // compareEqual, greater, less - t.equal(execute.scopedEval('compareEqual("abc","Abc")'), true); - t.equal(execute.scopedEval('compareEqual(2,2)'), true); - t.equal(execute.scopedEval('compareGreaterThan(5,2)'), true); - t.equal(execute.scopedEval('compareLessThan(1,2)'), true); - - // list helpers: prepare a list object and run several ops - const listResult = execute.scopedEval(`(function(){ - globalState.vm = { runtime: { runtimeOptions: { caseSensitiveLists: false } } }; - const l = { value: ['a','B','3'], _monitorUpToDate: true }; - const containsA = listContains(l, 'A'); - const idxB = listIndexOf(l, 'B'); - listReplace(l, 2, 'X'); - const replaced = l.value[1]; - listInsert(l, 'last', 'Z'); - listDelete(l, 1); - const contents = listContents(l); - return { containsA, idxB, replaced, contents, final: l.value }; - })()`); - t.equal(listResult.containsA, true); - t.equal(listResult.idxB, 2); - t.equal(listResult.replaced, 'X'); - t.match(listResult.contents, /X/); - - // mod - t.equal(execute.scopedEval('mod(-1,3)'), 2); - - // tan special cases - t.equal(execute.scopedEval('tan(90)'), Infinity); - t.equal(execute.scopedEval('tan(0)'), 0); - - t.same(execute.scopedEval('parseJSON("{\\"value\\":1}")'), {value: 1}); - t.equal(execute.scopedEval('parseJSON("not json")'), undefined); - - // yieldThenCall returns a generator that yields once then returns value - const yieldRes = execute.scopedEval('(function(){ const g = yieldThenCall(()=>5); g.next(); return g.next().value; })()'); - t.equal(yieldRes, 5); - - t.end(); -}); diff --git a/test/unit/engine_runtime.js b/test/unit/engine_runtime.js index 68341c29833..d99ecbe5930 100644 --- a/test/unit/engine_runtime.js +++ b/test/unit/engine_runtime.js @@ -4,7 +4,6 @@ const readFileToBuffer = require('../fixtures/readProjectFile').readFileToBuffer const VirtualMachine = require('../../src/virtual-machine'); const Runtime = require('../../src/engine/runtime'); const MonitorRecord = require('../../src/engine/monitor-record'); -const {Map} = require('immutable'); const test = tap.test; @@ -28,15 +27,15 @@ test('spec', t => { test('monitorStateEquals', t => { const r = new Runtime(); const id = 'xklj4#!'; - const prevMonitorState = MonitorRecord({ + const prevMonitorState = new MonitorRecord({ id, opcode: 'turtle whereabouts', value: '25' }); - const newMonitorDelta = Map({ + const newMonitorDelta = { id, value: String(25) - }); + }; r.requestAddMonitor(prevMonitorState); r.requestUpdateMonitor(newMonitorDelta); @@ -49,31 +48,32 @@ test('monitorStateDoesNotEqual', t => { const r = new Runtime(); const id = 'xklj4#!'; const params = {seven: 7}; - const prevMonitorState = MonitorRecord({ + const prevMonitorState = new MonitorRecord({ id, opcode: 'turtle whereabouts', value: '25' }); // Value change - let newMonitorDelta = Map({ + let newMonitorDelta = { id, value: String(24) - }); + }; r.requestAddMonitor(prevMonitorState); r.requestUpdateMonitor(newMonitorDelta); - t.equals(false, prevMonitorState.equals(r._monitorState.get(id))); + t.equals(true, r._monitorState.dirty); t.equals(String(24), r._monitorState.get(id).get('value')); // Prop change - newMonitorDelta = Map({ + r._monitorState.dirty = false; + newMonitorDelta = { id: 'xklj4#!', params: params - }); + }; r.requestUpdateMonitor(newMonitorDelta); - t.equals(false, prevMonitorState.equals(r._monitorState.get(id))); + t.equals(true, r._monitorState.dirty); t.equals(String(24), r._monitorState.get(id).value); t.equals(params, r._monitorState.get(id).params); diff --git a/test/unit/engine_runtime_tw.js b/test/unit/engine_runtime_tw.js index 179b4f365f2..b8416d89a74 100644 --- a/test/unit/engine_runtime_tw.js +++ b/test/unit/engine_runtime_tw.js @@ -1,7 +1,10 @@ const tap = require('tap'); +const {OrderedMap} = require('immutable'); const Runtime = require('../../src/engine/runtime'); -const {Map} = require('immutable'); +const VirtualMachine = require('../../src/virtual-machine'); +const MonitorRecord = require('../../src/engine/monitor-record'); const makeTestStorage = require('../fixtures/make-test-storage'); +const Target = require('../../src/engine/target'); const test = tap.test; @@ -157,12 +160,12 @@ test('debug', t => { test('setStageSize preserves monitor position relative to center of stage', t => { const rt = new Runtime(); - rt.requestAddMonitor(new Map([ - ['id', 'abc'], + rt.requestAddMonitor(new MonitorRecord({ + id: 'abc', // top right corner - ['x', 0], - ['y', 0] - ])); + x: 0, + y: 0 + })); rt.setStageSize(640, 362); const finalState = rt.getMonitorState().get('abc'); t.equal(finalState.get('x'), 80); @@ -170,6 +173,16 @@ test('setStageSize preserves monitor position relative to center of stage', t => t.end(); }); +test('VM monitor updates remain compatible with the GUI', t => { + const vm = new VirtualMachine(); + vm.once(Runtime.MONITORS_UPDATE, monitors => { + t.equal(OrderedMap.isOrderedMap(monitors), true); + t.end(); + }); + vm.runtime.requestAddMonitor(new MonitorRecord({id: 'abc'})); + vm.runtime._step(); +}); + test('setStageSize argument range', t => { t.plan(6); const rt = new Runtime(); @@ -253,3 +266,166 @@ test('convertToPackagedRuntime and attachStorage call order', t => { rt2.attachStorage(makeTestStorage()); t.end(); }); + +test('visual report -0', t => { + t.plan(1); + + const rt = new Runtime(); + const target = new Target(); + rt.setEditingTarget(target); + + rt.on(Runtime.VISUAL_REPORT, report => { + t.same(report, { + id: 'blockid', + value: '-0' + }); + }); + rt.visualReport(target, 'blockid', -0); + + t.end(); +}); + +test('visual report supports legacy compiler calls', t => { + t.plan(1); + + const rt = new Runtime(); + rt.setEditingTarget(new Target()); + rt.on(Runtime.VISUAL_REPORT, report => { + t.same(report, {id: 'blockid', value: '{"ok":true}'}); + }); + rt.visualReport('blockid', {ok: true}); + + t.end(); +}); + +const makeMonitorBlock = () => ({ + id: 'fakeMonitor', + opcode: 'data_variable', + fields: { + VARIABLE: { + name: 'VARIABLE', + value: 'x', + id: 'fakeMonitor' + } + }, + inputs: {}, + topLevel: true, + next: null, + parent: null, + shadow: false, + x: 0, + y: 0, + isMonitored: true, + targetId: null +}); + +test('_pushMonitors does nothing when no targets are installed', t => { + const rt = new Runtime(); + rt.monitorBlocks.createBlock(makeMonitorBlock()); + + t.equal(rt.targets.length, 0); + rt._pushMonitors(); + t.equal(rt.threads.length, 0); + + t.end(); +}); + +test('_pushMonitors queues threads once targets are installed', t => { + const rt = new Runtime(); + rt.monitorBlocks.createBlock(makeMonitorBlock()); + + const stage = new Target(rt); + rt.targets.push(stage); + rt.setEditingTarget(stage); + + rt._pushMonitors(); + t.equal(rt.threads.length, 1); + t.equal(rt.threads[0].target, stage); + t.equal(rt.threads[0].updateMonitor, true); + + t.end(); +}); + +const makeCommandBlock = id => ({ + id, + opcode: 'motion_movesteps', + fields: {}, + inputs: {}, + topLevel: true, + next: null, + parent: null, + shadow: false, + x: 0, + y: 0 +}); + +test('toggleScript is scoped to its target when block IDs collide', t => { + const rt = new Runtime(); + // Avoid compiling the fake single-block scripts. + rt.setCompilerOptions({enabled: false}); + + // Two sprites whose scripts share a top block ID. This happens when a block + // is copied between sprites without its ID being regenerated. + const spriteA = new Target(rt); + const spriteB = new Target(rt); + spriteA.blocks.createBlock(makeCommandBlock('dup')); + spriteB.blocks.createBlock(makeCommandBlock('dup')); + + // Start the script on sprite A. + rt.toggleScript('dup', {target: spriteA, stackClick: true}); + t.equal(rt.threads.length, 1, 'sprite A script started'); + t.equal(rt.threads[0].target, spriteA); + + // Clicking the same-ID script on sprite B must start B, not stop A. + rt.toggleScript('dup', {target: spriteB, stackClick: true}); + t.equal(rt.threads.length, 2, 'sprite B script started as a second thread'); + t.notOk(rt.threads[0].isKilled, 'sprite A thread was not stopped'); + t.equal(rt.threads[1].target, spriteB); + + // Toggling B again stops only B, leaving A running. + rt.toggleScript('dup', {target: spriteB, stackClick: true}); + t.notOk(rt.threads[0].isKilled, 'sprite A thread still running'); + t.ok(rt.threads[1].isKilled, 'sprite B thread stopped'); + + t.end(); +}); + +test('toggleScript scopes colliding block IDs using the editing target', t => { + const rt = new Runtime(); + rt.setCompilerOptions({enabled: false}); + + const spriteA = new Target(rt); + const spriteB = new Target(rt); + spriteA.blocks.createBlock(makeCommandBlock('dup')); + spriteB.blocks.createBlock(makeCommandBlock('dup')); + + rt.setEditingTarget(spriteA); + rt.toggleScript('dup', {stackClick: true}); + t.equal(rt.threads.length, 1, 'sprite A script started'); + t.equal(rt.threads[0].target, spriteA); + + rt.setEditingTarget(spriteB); + rt.toggleScript('dup', {stackClick: true}); + t.equal(rt.threads.length, 2, 'sprite B script started as a second thread'); + t.notOk(rt.threads[0].isKilled, 'sprite A thread was not stopped'); + t.equal(rt.threads[1].target, spriteB); + + t.end(); +}); + +test('toggleScript still toggles a running script off on the same target', t => { + const rt = new Runtime(); + rt.setCompilerOptions({enabled: false}); + + const sprite = new Target(rt); + sprite.blocks.createBlock(makeCommandBlock('top')); + + rt.toggleScript('top', {target: sprite, stackClick: true}); + t.equal(rt.threads.length, 1, 'script started'); + t.notOk(rt.threads[0].isKilled); + + rt.toggleScript('top', {target: sprite, stackClick: true}); + t.ok(rt.threads[0].isKilled, 'clicking again stopped the script'); + + t.end(); +}); diff --git a/test/unit/execute.js b/test/unit/execute.js index fcf68ad220b..2a665cbeaf8 100644 --- a/test/unit/execute.js +++ b/test/unit/execute.js @@ -71,7 +71,7 @@ test('execute visualReport and requestUpdateMonitor on top-level reporter', t => // Override monitorBlocks.getBlock to a simple stub for this test runtime.monitorBlocks.getBlock = () => ({ targetId: null }); runtime.requestUpdateMonitor = (m) => { monitorRequested = m; }; - runtime.visualReport = (id, val) => { reported = {id, val}; }; + runtime.visualReport = (target, id, val) => { reported = {target, id, val}; }; const thread = new Thread('b1'); thread.target = { id: 't1', blocks: { getNextBlock: () => null }, getName: () => 'T' }; @@ -91,8 +91,8 @@ test('execute visualReport and requestUpdateMonitor on top-level reporter', t => execute(sequencer, thread); - t.same(reported, { id: 'b1', val: 123 }, 'visualReport called for stackClick'); - t.ok(monitorRequested && monitorRequested.get('value') === 123, 'monitor update requested'); + t.same(reported, {target: thread.target, id: 'b1', val: 123}, 'visualReport called for stackClick'); + t.ok(monitorRequested && monitorRequested.value === 123, 'monitor update requested'); t.end(); }); diff --git a/test/unit/extension_text_to_speech.js b/test/unit/extension_text_to_speech.js index a6fd9dbfa61..83c065493c1 100644 --- a/test/unit/extension_text_to_speech.js +++ b/test/unit/extension_text_to_speech.js @@ -39,6 +39,6 @@ test('use localized spoken language name in place of localized written language ext.getEditorLanguage = () => 'es'; const languageMenu = ext.getLanguageMenu(); const localizedNameForChineseInSpanish = languageMenu.find(el => el.value === 'zh-cn').text; - t.strictEqual(localizedNameForChineseInSpanish, 'Chino (Mandarín)'); // i.e. should not be 'Chino (simplificado)' + t.strictEqual(localizedNameForChineseInSpanish, 'Chino (mandarín)'); // i.e. should not be 'Chino (simplificado)' t.end(); }); diff --git a/test/unit/tw_block_sensing.js b/test/unit/tw_block_sensing.js new file mode 100644 index 00000000000..4a46e396adc --- /dev/null +++ b/test/unit/tw_block_sensing.js @@ -0,0 +1,36 @@ +const {test} = require('tap'); +const Scratch3SensingBlocks = require('../../src/blocks/scratch3_sensing'); +const Runtime = require('../../src/engine/runtime'); + +test('isOnline', t => { + const rt = new Runtime(); + const sensing = new Scratch3SensingBlocks(rt); + + if (!global.navigator) { + global.navigator = {}; + } + + Object.defineProperty(global.navigator, 'onLine', { + get: () => false, + configurable: true, + enumerable: true + }); + t.equal(sensing.isOnline(), false); + + Object.defineProperty(global.navigator, 'onLine', { + get: () => true, + configurable: true, + enumerable: true + }); + t.equal(sensing.isOnline(), true); + + t.end(); +}); + +test('stage dimensions', t => { + const rt = new Runtime(); + const primitives = new Scratch3SensingBlocks(rt).getPrimitives(); + t.equal(primitives.sensing_stagewidth(), rt.stageWidth); + t.equal(primitives.sensing_stageheight(), rt.stageHeight); + t.end(); +}); diff --git a/test/unit/tw_block_shape.js b/test/unit/tw_block_shape.js new file mode 100644 index 00000000000..a5ef50282a6 --- /dev/null +++ b/test/unit/tw_block_shape.js @@ -0,0 +1,38 @@ +const {test} = require('tap'); +const Runtime = require('../../src/engine/runtime'); +const Scratch = require('../../src/extension-support/tw-extension-api-common'); + +test('blockShape', t => { + const rt = new Runtime(); + rt._registerExtensionPrimitives({ + id: 'shapetest', + name: 'shapetest', + blocks: [ + { + blockType: Scratch.BlockType.REPORTER, + blockShape: Scratch.BlockShape.HEXAGONAL, + opcode: 'hexagonal', + text: 'hexagonal' + }, + { + blockType: Scratch.BlockType.BOOLEAN, + blockShape: Scratch.BlockShape.ROUND, + opcode: 'round', + text: 'round' + }, + { + blockType: Scratch.BlockType.REPORTER, + blockShape: Scratch.BlockShape.SQUARE, + opcode: 'square', + text: 'square' + } + ] + }); + + const json = rt.getBlocksJSON(); + t.equal(json.length, 3); + t.equal(json[0].outputShape, 1); + t.equal(json[1].outputShape, 2); + t.equal(json[2].outputShape, 3); + t.end(); +}); diff --git a/test/unit/tw_compiler_extension_api.js b/test/unit/tw_compiler_extension_api.js new file mode 100644 index 00000000000..bf170d64174 --- /dev/null +++ b/test/unit/tw_compiler_extension_api.js @@ -0,0 +1,101 @@ +const test = require('tap').test; +const VirtualMachine = require('../../src/virtual-machine'); +const JSGenerator = require('../../src/compiler/jsgen'); + +test('compiler extension API emits native code', async t => { + const vm = new VirtualMachine(); + const {compiler} = vm.exports; + compiler.register('compilerTest', { + double: { + type: compiler.types.NUMBER, + compile: ({input, mutation}) => `(${input.number('VALUE')} * ${mutation.factor})` + } + }); + vm.extensionManager.addBuiltinExtension('compilerTest', class { + getInfo () { + return { + id: 'compilerTest', + name: 'Compiler test', + blocks: [{ + opcode: 'double', + blockType: 'reporter', + text: 'double [VALUE]', + arguments: {VALUE: {type: 'number'}} + }] + }; + } + double () { + return 'interpreted'; + } + }); + + await vm.loadProject({ + targets: [{ + isStage: true, + name: 'Stage', + variables: {}, + lists: {}, + broadcasts: {}, + blocks: { + hat: { + opcode: 'event_whenflagclicked', + next: 'say', + parent: null, + inputs: {}, + fields: {}, + topLevel: true, + x: 0, + y: 0 + }, + say: { + opcode: 'looks_say', + next: null, + parent: 'hat', + inputs: {MESSAGE: [2, 'double']}, + fields: {}, + topLevel: false + }, + double: { + opcode: 'compilerTest_double', + next: null, + parent: 'say', + inputs: {VALUE: [1, [4, '3']]}, + fields: {}, + mutation: {factor: '2'}, + topLevel: false + } + }, + comments: {}, + currentCostume: 0, + costumes: [], + sounds: [], + volume: 100, + layerOrder: 0, + tempo: 60, + videoTransparency: 50, + videoState: 'on', + textToSpeechLanguage: null + }], + monitors: [], + extensions: ['compilerTest'], + meta: {semver: '3.0.0', vm: '3.0.0', agent: ''} + }); + + let source = ''; + JSGenerator.testingApparatus = {report: (generator, generated) => { + source += generated; + }}; + vm.runtime.precompile(); + JSGenerator.testingApparatus = null; + + t.match(source, /3 \* 2/, 'custom reporter was compiled directly'); + t.notMatch(source, /compilerTest_double/, 'compatibility bridge was not used'); + + const input = name => name; + input.number = name => name; + t.equal( + vm.runtime.compilerExtensions.get('operator_min').compile({input, mutation: {itemcount: '3'}}), + 'Math.min(NUM1,NUM2,NUM3)', + 'extendable compiler inputs follow their mutation' + ); +}); diff --git a/test/unit/tw_extension_api_common.js b/test/unit/tw_extension_api_common.js index 051fcf134fc..cbb1d6bbfa5 100644 --- a/test/unit/tw_extension_api_common.js +++ b/test/unit/tw_extension_api_common.js @@ -32,3 +32,13 @@ test('Cast', t => { t.equal(ScratchCommon.Cast.toListIndex('1.5', 10, false), 1); t.end(); }); + +test('external', t => { + // has more tests in separate file, mostly just making sure that external exists at all + ScratchCommon.external.fetch('data:text/plain;,test').then(r => { + r.text().then(text => { + t.equal(text, 'test'); + t.end(); + }); + }); +}); diff --git a/test/unit/tw_external.js b/test/unit/tw_external.js new file mode 100644 index 00000000000..2110412d305 --- /dev/null +++ b/test/unit/tw_external.js @@ -0,0 +1,65 @@ +const external = require('../../src/extension-support/tw-external'); +const {test} = require('tap'); + +test('importModule', t => { + external.importModule('data:text/javascript;,export%20default%201').then(mod => { + t.equal(mod.default, 1); + t.end(); + }); +}); + +test('fetch', t => { + external.fetch('data:text/plain;,test').then(res => { + res.text().then(text => { + t.equal(text, 'test'); + t.end(); + }); + }); +}); + +test('dataURL', t => { + global.FileReader = class { + readAsDataURL (blob) { + blob.arrayBuffer().then(arrayBuffer => { + const base64 = Buffer.from(arrayBuffer).toString('base64'); + this.result = `data:${blob.type};base64,${base64}`; + this.onload(); + }); + } + }; + + external.dataURL('data:text/plain;,doesthiswork').then(dataURL => { + t.equal(dataURL, `data:text/plain;base64,${btoa('doesthiswork')}`); + t.end(); + }); +}); + +test('blob', t => { + external.blob('data:text/plain;,test').then(blob => { + blob.text().then(blobText => { + t.equal(blobText, 'test'); + t.end(); + }); + }); +}); + +test('evalAndReturn', t => { + external.evalAndReturn('data:text/plain;,var%20x=20', 'x').then(result => { + t.equal(result, 20); + t.end(); + }); +}); + +test('evalAndReturn with a trailing comment without newline', t => { + external.evalAndReturn('data:text/plain;,var%20x=20 // whatever', 'x').then(result => { + t.equal(result, 20); + t.end(); + }); +}); + +test('relative URL throws', t => { + external.fetch('./test.js').catch(err => { + t.equal(err.message, `Unsupported URL: ./test.js`); + t.end(); + }); +}); diff --git a/test/unit/tw_mistwarp_compiler_blocks.js b/test/unit/tw_mistwarp_compiler_blocks.js new file mode 100644 index 00000000000..2a73aeb192f --- /dev/null +++ b/test/unit/tw_mistwarp_compiler_blocks.js @@ -0,0 +1,629 @@ +const test = require('tap').test; +const VirtualMachine = require('../../src/virtual-machine'); +const JSGenerator = require('../../src/compiler/jsgen'); +const {runtimeFunctions} = require('../../src/compiler/jsexecute'); + +test('MistWarp text and coordinate blocks compile directly', async t => { + const vm = new VirtualMachine(); + await vm.loadProject({ + targets: [{ + isStage: true, + name: 'Stage', + variables: {}, + lists: {list: ['items', []]}, + broadcasts: {}, + blocks: { + hat: { + opcode: 'event_whenflagclicked', + next: 'point', + parent: null, + inputs: {}, + fields: {}, + topLevel: true, + x: 0, + y: 0 + }, + point: { + opcode: 'motion_pointtowards_xyfrom', + next: 'print', + parent: 'hat', + inputs: { + X: [1, [4, '10']], Y: [1, [4, '10']], FROMX: [1, [4, '0']], FROMY: [1, [4, '0']] + }, + fields: {}, + topLevel: false + }, + print: { + opcode: 'pen_printText', + next: 'say', + parent: 'point', + inputs: {TEXT: [2, 'trim'], X: [1, [4, '0']], Y: [1, [4, '0']]}, + fields: {}, + topLevel: false + }, + trim: { + opcode: 'operator_trim', + next: null, + parent: 'print', + inputs: {STRING: [1, [10, ' text ']]}, + fields: {}, + topLevel: false + }, + say: { + opcode: 'looks_say', + next: 'setList', + parent: 'print', + inputs: {MESSAGE: [2, 'costumes']}, + fields: {}, + topLevel: false + }, + costumes: { + opcode: 'looks_costumes', next: null, parent: 'say', inputs: {}, fields: {}, topLevel: false + }, + setList: { + opcode: 'data_set_list_to_array', + next: 'sayList', + parent: 'say', + inputs: {ARRAY: [1, [10, '["a","b"]']]}, + fields: {LIST: ['items', 'list']}, + topLevel: false + }, + sayList: { + opcode: 'looks_say', + next: null, + parent: 'setList', + inputs: {MESSAGE: [2, 'listAs']}, + fields: {}, + topLevel: false + }, + listAs: { + opcode: 'data_get_list_as', + next: null, + parent: 'sayList', + inputs: {}, + fields: {LIST: ['items', 'list'], FORMAT: ['JSON', null]}, + topLevel: false + } + }, + comments: {}, + currentCostume: 0, + costumes: [], + sounds: [], + volume: 100, + layerOrder: 0, + tempo: 60, + videoTransparency: 50, + videoState: 'on', + textToSpeechLanguage: null + }], + monitors: [], + extensions: ['pen'], + meta: {semver: '3.0.0', vm: '3.0.0', agent: ''} + }); + + let source = ''; + JSGenerator.testingApparatus = {report: (_generator, generated) => { + source += generated; + }}; + vm.runtime.precompile(); + JSGenerator.testingApparatus = null; + + t.match(source, /Math\.atan2/, 'coordinate block is native'); + t.match(source, /_printText/, 'pen text block is native'); + t.match(source, /\.trim\(\)/, 'text operator is native'); + t.match(source, /getCostumes\(\)\.map/, 'costume list reporter is native'); + t.match(source, /JSON\.parse/, 'list import is native'); + t.match(source, /JSON\.stringify\(.*\.value\)/, 'list export is native'); + t.notMatch(source, /executeInCompatibilityLayer/, 'local blocks avoid compatibility fallback'); +}); + +test('compiled list helpers preserve case-sensitive mode', t => { + const globalState = {thread: {target: {runtime: {runtimeOptions: {caseSensitiveLists: true}}}}}; + const makeHelper = source => new Function( + 'globalState', `${source}; return ${source.match(/const (\w+)/)[1]};` + )(globalState); + const contains = makeHelper(runtimeFunctions.listContains); + const indexOf = makeHelper(runtimeFunctions.listIndexOf); + const list = {value: ['jump', 'Jump']}; + + t.equal(contains(list, 'JUMP'), false); + t.equal(indexOf(list, 'Jump'), 2); + t.end(); +}); + +test("legacy Mist's Utils patch blocks splice raw JavaScript", async t => { + const vm = new VirtualMachine(); + await vm.loadProject({ + targets: [{ + isStage: true, + name: 'Stage', + variables: {}, + lists: {}, + broadcasts: {}, + blocks: { + hat: { + opcode: 'event_whenflagclicked', + next: 'patch', + parent: null, + inputs: {}, + fields: {}, + topLevel: true, + x: 0, + y: 0 + }, + patch: { + opcode: 'mistsutils_patchcommand3', + next: 'nativePatch', + parent: 'hat', + inputs: { + A: [1, [10, 'globalThis.__originPatch = ']], + B: [2, 'sum'], + C: [1, [10, ';']] + }, + fields: {}, + topLevel: false + }, + nativePatch: { + opcode: 'patching_jscommand', + next: null, + parent: 'patch', + inputs: { + ARG1: [1, [10, 'globalThis.__nativePatch = ']], + ARG2: [1, [10, '4']], + ARG3: [1, [10, ';']] + }, + fields: {}, + mutation: {tagName: 'mutation', children: [], itemcount: '3'}, + topLevel: false + }, + sum: { + opcode: 'operator_add', + next: null, + parent: 'patch', + inputs: {NUM1: [1, [4, '1']], NUM2: [1, [4, '2']], NUM3: [1, [4, '3']]}, + fields: {}, + mutation: {tagName: 'mutation', children: [], itemcount: '3'}, + topLevel: false + } + }, + comments: {}, + currentCostume: 0, + costumes: [], + sounds: [], + volume: 100, + layerOrder: 0, + tempo: 60, + videoTransparency: 50, + videoState: 'on', + textToSpeechLanguage: null + }], + monitors: [], + extensions: ['patching'], + meta: {semver: '3.0.0', vm: '3.0.0', agent: ''} + }); + + let source = ''; + JSGenerator.testingApparatus = {report: (_generator, generated) => { + source += generated; + }}; + vm.runtime.precompile(); + JSGenerator.testingApparatus = null; + + t.ok(vm.extensionManager.isExtensionLoaded('patching'), 'legacy blocks load built-in Patching'); + t.notOk(vm.extensionManager.isExtensionLoaded('mistsutils'), "Mist's Utils is not loaded"); + const migrated = vm.runtime.getTargetForStage().blocks.getBlock('patch'); + t.equal(migrated.opcode, 'patching_jscommand', 'legacy opcode is migrated'); + t.equal(migrated.mutation.itemcount, '3', 'legacy arity is preserved'); + t.match( + source, + /globalThis\.__originPatch = \(toNotNaN\(\(1 \+ 2\)\) \+ 3\);/, + 'literal source and variadic reporters are joined' + ); + t.match(source, /globalThis\.__nativePatch = 4;/, 'native Patching blocks splice JavaScript'); + t.notMatch(source, /"globalThis\.__originPatch/, 'raw source is not emitted as a quoted statement'); + t.notMatch(source, /executeInCompatibilityLayer/, 'patching does not use the runtime compatibility bridge'); +}); + +test("Mist's Utils compiler API cannot alter raw patch syntax", async t => { + const vm = new VirtualMachine(); + vm.extensionManager.addBuiltinExtension('mistsutils', class { + getInfo () { + return { + id: 'mistsutils', + name: "Mist's Utils", + blocks: [{ + opcode: 'patchcommand', + blockType: 'command', + text: '[A]', + arguments: {A: {type: 'string'}} + }] + }; + } + patchcommand () {} + }); + const command = vm.exports.compiler.types.COMMAND; + vm.exports.compiler.register('mistsutils', { + patchcommand: { + type: command, + compile: ({input}) => input.raw('A') + } + }); + await vm.loadProject({ + targets: [{ + isStage: true, + name: 'Stage', + variables: {}, + lists: {}, + broadcasts: {}, + blocks: { + hat: { + opcode: 'event_whenflagclicked', + next: 'if', + parent: null, + inputs: {}, + fields: {}, + topLevel: true, + x: 0, + y: 0 + }, + if: { + opcode: 'mistsutils_patchcommand', + next: 'else', + parent: 'hat', + inputs: {A: [1, [10, 'if (true) globalThis.__originIcon = 1;']]}, + fields: {}, + topLevel: false + }, + else: { + opcode: 'mistsutils_patchcommand', + next: null, + parent: 'if', + inputs: {A: [1, [10, 'else globalThis.__originIcon = 2;']]}, + fields: {}, + topLevel: false + } + }, + comments: {}, + currentCostume: 0, + costumes: [], + sounds: [], + volume: 100, + layerOrder: 0, + tempo: 60, + videoTransparency: 50, + videoState: 'on', + textToSpeechLanguage: null + }], + monitors: [], + extensions: [], + meta: {semver: '3.0.0', vm: '3.0.0', agent: ''} + }); + + let source = ''; + JSGenerator.testingApparatus = {report: (_generator, generated) => { + source += generated; + }}; + vm.runtime.precompile(); + JSGenerator.testingApparatus = null; + + t.match(source, /if \(true\) globalThis\.__originIcon = 1;\s*else globalThis\.__originIcon = 2;/); + t.notMatch(source, /;;\s*else/, 'raw commands are not terminated twice'); +}); + +test("Mist's Utils 5.9 blocks use native compiler cases", async t => { + const vm = new VirtualMachine(); + vm.extensionManager.addBuiltinExtension('mistsutils', class { + getInfo () { + return { + id: 'mistsutils', + name: "Mist's Utils", + blocks: [{ + opcode: 'starts', + blockType: 'Boolean', + text: '[A] starts with [B]', + arguments: {A: {type: 'string'}, B: {type: 'string'}} + }] + }; + } + starts () {} + }); + await vm.loadProject({ + targets: [{ + isStage: true, + name: 'Stage', + variables: {}, + lists: {}, + broadcasts: {}, + blocks: { + hat: { + opcode: 'event_whenflagclicked', + next: 'if', + parent: null, + inputs: {}, + fields: {}, + topLevel: true, + x: 0, + y: 0 + }, + if: { + opcode: 'control_if', + next: null, + parent: 'hat', + inputs: {CONDITION: [2, 'report'], SUBSTACK: [2, null]}, + fields: {}, + topLevel: false + }, + report: { + opcode: 'mistsutils_starts', + next: null, + parent: 'if', + inputs: {A: [1, [10, 'origin']], B: [1, [10, 'ori']]}, + fields: {}, + topLevel: false + } + }, + comments: {}, + currentCostume: 0, + costumes: [], + sounds: [], + volume: 100, + layerOrder: 0, + tempo: 60, + videoTransparency: 50, + videoState: 'on', + textToSpeechLanguage: null + }], + monitors: [], + extensions: [], + meta: {semver: '3.0.0', vm: '3.0.0', agent: ''} + }); + + let source = ''; + JSGenerator.testingApparatus = {report: (_generator, generated) => { + source += generated; + }}; + vm.runtime.precompile(); + JSGenerator.testingApparatus = null; + + t.match(source, /\("origin"\)\.startsWith\("ori"\)/); + t.notMatch(source, /oldCompiler|executeInCompatibilityLayer/); +}); + +test('native switch keeps raw patch values uncoerced', async t => { + const vm = new VirtualMachine(); + await vm.loadProject({ + targets: [{ + isStage: true, + name: 'Stage', + variables: {}, + lists: {}, + broadcasts: {}, + blocks: { + hat: { + opcode: 'event_whenflagclicked', + next: 'setup', + parent: null, + inputs: {}, + fields: {}, + topLevel: true, + x: 0, + y: 0 + }, + setup: { + opcode: 'mistsutils_patchcommand', + next: 'switch', + parent: 'hat', + inputs: {A: [1, [10, 'const num = 17; const tkn = {cmd: 17, str: 5}; globalThis.__switchResult = "none";']]}, + fields: {}, + topLevel: false + }, + switch: { + opcode: 'control_switch', + next: null, + parent: 'setup', + inputs: {VALUE: [3, 'discriminant', [10, '']], SUBSTACK: [2, 'rawCase']}, + fields: {}, + topLevel: false + }, + discriminant: { + opcode: 'mistsutils_patchreporter', + next: null, + parent: 'switch', + inputs: {A: [1, [10, 'num']]}, + fields: {}, + topLevel: false + }, + rawCase: { + opcode: 'mistsutils_patchcommand', + next: 'case', + parent: 'switch', + inputs: {A: [1, [10, 'case tkn.cmd: globalThis.__switchResult = "cmd"; break;']]}, + fields: {}, + topLevel: false + }, + case: { + opcode: 'control_case', + next: 'default', + parent: 'rawCase', + inputs: {VALUE: [3, 'caseValue', [10, '']], SUBSTACK: [2, 'caseBody']}, + fields: {}, + topLevel: false + }, + caseValue: { + opcode: 'mistsutils_patchreporter', + next: null, + parent: 'case', + inputs: {A: [1, [10, 'tkn.str']]}, + fields: {}, + topLevel: false + }, + caseBody: { + opcode: 'mistsutils_patchcommand', + next: null, + parent: 'case', + inputs: {A: [1, [10, 'globalThis.__switchResult = "str";']]}, + fields: {}, + topLevel: false + }, + default: { + opcode: 'control_default', + next: null, + parent: 'case', + inputs: {SUBSTACK: [2, 'defaultBody']}, + fields: {}, + topLevel: false + }, + defaultBody: { + opcode: 'mistsutils_patchcommand', + next: null, + parent: 'default', + inputs: {A: [1, [10, 'globalThis.__switchResult = "default";']]}, + fields: {}, + topLevel: false + } + }, + comments: {}, + currentCostume: 0, + costumes: [], + sounds: [], + volume: 100, + layerOrder: 0, + tempo: 60, + videoTransparency: 50, + videoState: 'on', + textToSpeechLanguage: null + }], + monitors: [], + extensions: [], + meta: {semver: '3.0.0', vm: '3.0.0', agent: ''} + }); + + let source = ''; + JSGenerator.testingApparatus = {report: (_generator, generated) => { + source += generated; + }}; + vm.runtime.precompile(); + JSGenerator.testingApparatus = null; + + t.match(source, /switch \(\(num\)\) \{/, 'raw discriminant is not stringified'); + t.match(source, /case \(tkn\.str\): \{/, 'raw case value is not stringified'); + t.match(source, /case tkn\.cmd: globalThis\.__switchResult = "cmd"; break;/, 'spliced case statement is preserved'); + + vm.greenFlag(); + vm.runtime._step(); + t.equal(global.__switchResult, 'cmd', 'raw spliced case matches the raw discriminant'); + delete global.__switchResult; +}); + +test('casting a raw patch reporter keeps its operator precedence', async t => { + const vm = new VirtualMachine(); + vm.extensionManager.addBuiltinExtension('mistsutils', class { + getInfo () { + return { + id: 'mistsutils', + name: "Mist's Utils", + blocks: [{ + opcode: 'ifthen', + blockType: 'reporter', + text: 'if [A] then [B] else [C]', + arguments: {A: {type: 'Boolean'}, B: {type: 'string'}, C: {type: 'string'}} + }, { + opcode: 'false', + blockType: 'Boolean', + text: 'false' + }] + }; + } + ifthen () {} + false () {} + }); + await vm.loadProject({ + targets: [{ + isStage: true, + name: 'Stage', + variables: {}, + lists: {}, + broadcasts: {}, + blocks: { + hat: { + opcode: 'event_whenflagclicked', + next: 'setup', + parent: null, + inputs: {}, + fields: {}, + topLevel: true, + x: 0, + y: 0 + }, + setup: { + opcode: 'mistsutils_patchcommand', + next: 'store', + parent: 'hat', + inputs: {A: [1, [10, 'const labels = ["type", "name", "location", "data"];']]}, + fields: {}, + topLevel: false + }, + store: { + opcode: 'mistsutils_patchcommand2', + next: null, + parent: 'setup', + inputs: { + A: [1, [10, 'globalThis.__rawIndex = ']], + B: [3, 'ifthen', [10, '']] + }, + fields: {}, + topLevel: false + }, + ifthen: { + opcode: 'mistsutils_ifthen', + next: null, + parent: 'store', + inputs: { + A: [2, 'never'], + B: [1, [10, 'unused']], + C: [3, 'lookup', [10, '']] + }, + fields: {}, + topLevel: false + }, + never: { + opcode: 'mistsutils_false', + next: null, + parent: 'ifthen', + inputs: {}, + fields: {}, + topLevel: false + }, + lookup: { + opcode: 'mistsutils_patchreporter', + next: null, + parent: 'ifthen', + inputs: {A: [1, [10, 'labels.indexOf("data") + 1']]}, + fields: {}, + topLevel: false + } + }, + comments: {}, + currentCostume: 0, + costumes: [], + sounds: [], + volume: 100, + layerOrder: 0, + tempo: 60, + videoTransparency: 50, + videoState: 'on', + textToSpeechLanguage: null + }], + monitors: [], + extensions: [], + meta: {semver: '3.0.0', vm: '3.0.0', agent: ''} + }); + + vm.runtime.precompile(); + vm.greenFlag(); + vm.runtime._step(); + + // "" + labels.indexOf("data") + 1 would concatenate to "31" instead of adding to 4. + t.equal(`${global.__rawIndex}`, '4', 'the spliced expression is added, not concatenated'); + delete global.__rawIndex; +}); diff --git a/test/unit/tw_monitor_record.js b/test/unit/tw_monitor_record.js new file mode 100644 index 00000000000..614d16c84aa --- /dev/null +++ b/test/unit/tw_monitor_record.js @@ -0,0 +1,60 @@ +const {test} = require('tap'); +const MonitorRecord = require('../../src/engine/monitor-record'); + +test('new and get', t => { + const record = new MonitorRecord({ + id: 'a', + x: 10, + y: 20 + }); + + t.equal(record.id, 'a'); + t.equal(record.x, 10); + t.equal(record.y, 20); + + t.equal(record.get('id'), 'a'); + t.equal(record.get('x'), 10); + t.equal(record.get('y'), 20); + + t.end(); +}); + +test('merge', t => { + const record = new MonitorRecord({ + id: 'a', + x: 10, + y: 20 + }); + + t.equal(record.merge({ + x: 40, + y: null + }), true); + t.equal(record.x, 40); + t.equal(record.y, 20); + + t.equal(record.merge({ + x: 40, + y: undefined + }), false); + t.equal(record.x, 40); + t.equal(record.y, 20); + + t.end(); +}); + +test('externalDeltaToJS', t => { + t.same(MonitorRecord.externalDeltaToJS({ + whatever: 'a' + }), {whatever: 'a'}); + + t.same(MonitorRecord.externalDeltaToJS({ + toJS: () => ({whatever: 'a'}) + }), {whatever: 'a'}); + + t.same(MonitorRecord.externalDeltaToJS( + new Map([['whatever', 'a']]) + ), {whatever: 'a'}); + + t.end(); +}); diff --git a/test/unit/tw_monitor_state.js b/test/unit/tw_monitor_state.js new file mode 100644 index 00000000000..780edb6bb26 --- /dev/null +++ b/test/unit/tw_monitor_state.js @@ -0,0 +1,115 @@ +const {test} = require('tap'); +const MonitorState = require('../../src/engine/tw-monitor-state'); +const MonitorRecord = require('../../src/engine/monitor-record'); + +test('basic operation', t => { + const state = new MonitorState(); + + t.equal(state.dirty, false); + t.equal(state.has('id'), false); + t.equal(state.size, 0); + t.equal(state.empty(), true); + + state.set('id', new MonitorRecord({ + id: 'id', + value: 0 + })); + t.equal(state.has('id'), true); + t.equal(state.get('id').id, 'id'); + t.equal(state.get('id').value, 0); + t.equal(state.size, 1); + t.equal(state.empty(), false); + t.equal(state.dirty, true); + + state.dirty = false; + state.set('id', new MonitorRecord({ + id: 'id', + value: -0 + })); + t.equal(state.get('id').value, -0); + t.equal(state.dirty, true); + + state.dirty = false; + state.set('id', new MonitorRecord({ + id: 'id', + value: -0 + })); + t.equal(state.dirty, false); + + state.dirty = false; + state.delete('id'); + t.equal(state.has('id'), false); + t.equal(state.get('id'), undefined); + t.equal(state.size, 0); + t.equal(state.empty(), true); + t.equal(state.dirty, true); + + state.dirty = false; + state.delete('id'); + t.equal(state.dirty, false); + + t.end(); +}); + +test('filter', t => { + const state = new MonitorState(); + + state.set('id1', new MonitorRecord({ + id: 'id1', + value: 5 + })); + state.set('id2', new MonitorRecord({ + id: 'id2', + value: 10 + })); + state.set('id3', new MonitorRecord({ + id: 'id3', + value: 15 + })); + + state.dirty = false; + state.filter(record => record.value !== 10); + t.equal(state.dirty, true); + t.equal(state.has('id1'), true); + t.equal(state.has('id2'), false); + t.equal(state.has('id3'), true); + + state.dirty = false; + state.filter(record => record.value !== 10); + t.equal(state.dirty, false); + + t.end(); +}); + +test('value', t => { + const state = new MonitorState(); + + const a = new MonitorRecord({ + id: 'a' + }); + const b = new MonitorRecord({ + id: 'b' + }); + state.set('a', a); + state.set('b', b); + + t.same(state.values(), [a, b]); + t.same(state.valueSeq(), [a, b]); + + t.end(); +}); + +test('shallowClone', t => { + const state = new MonitorState(); + + state.set('id', new MonitorRecord({ + id: 'id' + })); + + const clone = state.shallowClone(); + t.not(state, clone); + t.equal(state.map, clone.map); + t.equal(clone.dirty, false); + + t.end(); +}); diff --git a/test/unit/tw_mouse.js b/test/unit/tw_mouse.js new file mode 100644 index 00000000000..17aeb200f37 --- /dev/null +++ b/test/unit/tw_mouse.js @@ -0,0 +1,14 @@ +const {test} = require('tap'); +const Runtime = require('../../src/engine/runtime'); + +test('isDown does not error before project loads', t => { + const rt = new Runtime(); + rt.ioDevices.mouse.postData({ + isDown: true, + x: 20, + y: 20, + canvasWidth: 100, + canvasHeight: 100 + }); + t.end(); +}); diff --git a/test/unit/tw_old_compiler_compatibility.js b/test/unit/tw_old_compiler_compatibility.js new file mode 100644 index 00000000000..506bedece91 --- /dev/null +++ b/test/unit/tw_old_compiler_compatibility.js @@ -0,0 +1,32 @@ +const test = require('tap').test; + +const compatibility = require('../../src/compiler/old-compiler-compatibility'); +const {InputOpcode, InputType} = require('../../src/compiler/enums'); +const {IntermediateInput} = require('../../src/compiler/intermediate'); + +test('legacy compiler exports used by extensions remain available', t => { + const exports = compatibility.JSGeneratorStub.unstable_exports; + + t.type(exports.TypedInput, 'function'); + t.type(exports.ConstantInput, 'function'); + t.type(exports.VariableInput, 'function'); + t.type(exports.Frame, 'function'); + t.equal(exports.sanitize('"\n'), '\\"\\n'); + t.equal(new exports.ConstantInput('value').constantValue, 'value'); + t.equal(new exports.VariableInput('variable').asUnknown(), 'variable'); + + const stub = new compatibility.JSGeneratorStub({ + script: {}, + ir: {}, + target: {}, + frames: [], + currentFrame: null + }); + const literal = stub.fakeThis.descendInput(new IntermediateInput( + InputOpcode.CONSTANT, + InputType.STRING, + {value: 'raw source'} + )); + t.type(literal, exports.ConstantInput, 'raw patch inputs remain literals'); + t.end(); +}); diff --git a/test/unit/tw_safe_stringify.js b/test/unit/tw_safe_stringify.js new file mode 100644 index 00000000000..8307d6ea64a --- /dev/null +++ b/test/unit/tw_safe_stringify.js @@ -0,0 +1,32 @@ +const {test} = require('tap'); +const safeStringify = require('../../src/util/tw-safe-stringify'); + +test('safeStringify', t => { + t.equal(safeStringify(''), ''); + t.equal(safeStringify('a'), 'a'); + + t.equal(safeStringify(true), 'true'); + t.equal(safeStringify(false), 'false'); + + t.equal(safeStringify(0), '0'); + t.equal(safeStringify(-0), '-0'); + t.equal(safeStringify(1), '1'); + t.equal(safeStringify(Infinity), 'Infinity'); + t.equal(safeStringify(-Infinity), '-Infinity'); + t.equal(safeStringify(NaN), 'NaN'); + + t.equal(safeStringify(null), 'null'); + t.equal(safeStringify(undefined), 'undefined'); + + t.equal(safeStringify({}), '{}'); + t.equal(safeStringify({a: 'b'}), '{"a":"b"}'); + + t.equal(safeStringify([]), '[]'); + t.equal(safeStringify([1, 2, 3]), '[1,2,3]'); + + const circular = {}; + circular.circular = circular; + t.equal(safeStringify(circular), '{"circular":"{...}"}'); + + t.end(); +}); diff --git a/test/unit/virtual-machine_tw.js b/test/unit/virtual-machine_tw.js index b0d2f52c075..d41acde7daf 100644 --- a/test/unit/virtual-machine_tw.js +++ b/test/unit/virtual-machine_tw.js @@ -24,7 +24,7 @@ test('emitTargetsUpdate targetList is lazy', t => { t.end(); }); -test('non-primitive values in lists and variables converted to strings', t => { +test('values in lists and variables are serialized as-is', t => { const vm = new VirtualMachine(); const sprite = new Sprite(); const target = new RenderedTarget(sprite, vm.runtime); @@ -54,14 +54,14 @@ test('non-primitive values in lists and variables converted to strings', t => { const json = JSON.parse(vm.toJSON()); - t.deepEqual(json.targets[0].variables.var1[1], 'null'); - t.deepEqual(json.targets[0].variables.var2[1], 'undefined'); - t.deepEqual(json.targets[0].variables.var3[1], '[object Object]'); + t.deepEqual(json.targets[0].variables.var1[1], null); + t.deepEqual(json.targets[0].variables.var2[1], null); // undefined becomes null due to JSON limitations + t.deepEqual(json.targets[0].variables.var3[1], {}); t.deepEqual(json.targets[0].variables.var4[1], 1); t.deepEqual(json.targets[0].variables.var5[1], 'abc'); t.deepEqual(json.targets[0].variables.var6[1], false); - t.deepEqual(json.targets[0].lists.list[1], ['abc', false, 1, 'null', 'undefined', '[object Object]']); + t.deepEqual(json.targets[0].lists.list[1], ['abc', false, 1, null, null, {}]); t.end(); }); diff --git a/webpack.config.js b/webpack.config.js index 8686f7a7d91..90a27f852ac 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -69,7 +69,6 @@ module.exports = [ 'decode-html': true, 'format-message': true, 'htmlparser2': true, - 'immutable': true, 'scratch-parser': true, 'socket.io-client': true, 'text-encoding': true @@ -101,7 +100,7 @@ module.exports = [ loader: 'script-loader' }, { - test: require.resolve('scratch-blocks/dist/vertical.js'), + test: require.resolve('scratch-blocks/shim/vertical.js'), loader: 'expose-loader?Blockly' }, {