diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..adbdb1b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,3 @@ +[*] +indent_style = space +indent_size = 4 diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..c694529 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +trailingComma: "es5" +tabWidth: 4 +printWidth: 80 +semi: true +singleQuote: true diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1c52917 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "cSpell.words": [ + "ECLI", + "EROD", + "targetowania", + "targetowaniem", + "TSUE" + ] +} \ No newline at end of file diff --git a/assets/fonts/fira-code/ttf/FiraCode-Bold.ttf b/assets/fonts/fira-code/ttf/FiraCode-Bold.ttf new file mode 100644 index 0000000..f891bde Binary files /dev/null and b/assets/fonts/fira-code/ttf/FiraCode-Bold.ttf differ diff --git a/assets/fonts/fira-code/ttf/FiraCode-Light.ttf b/assets/fonts/fira-code/ttf/FiraCode-Light.ttf new file mode 100644 index 0000000..5664ec3 Binary files /dev/null and b/assets/fonts/fira-code/ttf/FiraCode-Light.ttf differ diff --git a/assets/fonts/fira-code/ttf/FiraCode-Medium.ttf b/assets/fonts/fira-code/ttf/FiraCode-Medium.ttf new file mode 100644 index 0000000..2c0ecdf Binary files /dev/null and b/assets/fonts/fira-code/ttf/FiraCode-Medium.ttf differ diff --git a/assets/fonts/fira-code/ttf/FiraCode-Regular.ttf b/assets/fonts/fira-code/ttf/FiraCode-Regular.ttf new file mode 100644 index 0000000..bd73685 Binary files /dev/null and b/assets/fonts/fira-code/ttf/FiraCode-Regular.ttf differ diff --git a/assets/fonts/fira-code/ttf/FiraCode-Retina.ttf b/assets/fonts/fira-code/ttf/FiraCode-Retina.ttf new file mode 100644 index 0000000..660742d Binary files /dev/null and b/assets/fonts/fira-code/ttf/FiraCode-Retina.ttf differ diff --git a/assets/fonts/fira-code/ttf/FiraCode-SemiBold.ttf b/assets/fonts/fira-code/ttf/FiraCode-SemiBold.ttf new file mode 100644 index 0000000..d8dcef6 Binary files /dev/null and b/assets/fonts/fira-code/ttf/FiraCode-SemiBold.ttf differ diff --git a/assets/fonts/fira-code/variable_ttf/FiraCode-VF.ttf b/assets/fonts/fira-code/variable_ttf/FiraCode-VF.ttf new file mode 100644 index 0000000..c05ac82 Binary files /dev/null and b/assets/fonts/fira-code/variable_ttf/FiraCode-VF.ttf differ diff --git a/assets/fonts/fira-code/woff/FiraCode-Bold.woff b/assets/fonts/fira-code/woff/FiraCode-Bold.woff new file mode 100644 index 0000000..74e57c4 Binary files /dev/null and b/assets/fonts/fira-code/woff/FiraCode-Bold.woff differ diff --git a/assets/fonts/fira-code/woff/FiraCode-Light.woff b/assets/fonts/fira-code/woff/FiraCode-Light.woff new file mode 100644 index 0000000..1c1ebc6 Binary files /dev/null and b/assets/fonts/fira-code/woff/FiraCode-Light.woff differ diff --git a/assets/fonts/fira-code/woff/FiraCode-Medium.woff b/assets/fonts/fira-code/woff/FiraCode-Medium.woff new file mode 100644 index 0000000..19251b0 Binary files /dev/null and b/assets/fonts/fira-code/woff/FiraCode-Medium.woff differ diff --git a/assets/fonts/fira-code/woff/FiraCode-Regular.woff b/assets/fonts/fira-code/woff/FiraCode-Regular.woff new file mode 100644 index 0000000..8816b69 Binary files /dev/null and b/assets/fonts/fira-code/woff/FiraCode-Regular.woff differ diff --git a/assets/fonts/fira-code/woff/FiraCode-SemiBold.woff b/assets/fonts/fira-code/woff/FiraCode-SemiBold.woff new file mode 100644 index 0000000..97857db Binary files /dev/null and b/assets/fonts/fira-code/woff/FiraCode-SemiBold.woff differ diff --git a/assets/fonts/fira-code/woff/FiraCode-VF.woff b/assets/fonts/fira-code/woff/FiraCode-VF.woff new file mode 100644 index 0000000..c3407ed Binary files /dev/null and b/assets/fonts/fira-code/woff/FiraCode-VF.woff differ diff --git a/assets/fonts/fira-code/woff2/FiraCode-Bold.woff2 b/assets/fonts/fira-code/woff2/FiraCode-Bold.woff2 new file mode 100644 index 0000000..349dc36 Binary files /dev/null and b/assets/fonts/fira-code/woff2/FiraCode-Bold.woff2 differ diff --git a/assets/fonts/fira-code/woff2/FiraCode-Light.woff2 b/assets/fonts/fira-code/woff2/FiraCode-Light.woff2 new file mode 100644 index 0000000..eeaa303 Binary files /dev/null and b/assets/fonts/fira-code/woff2/FiraCode-Light.woff2 differ diff --git a/assets/fonts/fira-code/woff2/FiraCode-Medium.woff2 b/assets/fonts/fira-code/woff2/FiraCode-Medium.woff2 new file mode 100644 index 0000000..7f1d770 Binary files /dev/null and b/assets/fonts/fira-code/woff2/FiraCode-Medium.woff2 differ diff --git a/assets/fonts/fira-code/woff2/FiraCode-Regular.woff2 b/assets/fonts/fira-code/woff2/FiraCode-Regular.woff2 new file mode 100644 index 0000000..f8b63fb Binary files /dev/null and b/assets/fonts/fira-code/woff2/FiraCode-Regular.woff2 differ diff --git a/assets/fonts/fira-code/woff2/FiraCode-SemiBold.woff2 b/assets/fonts/fira-code/woff2/FiraCode-SemiBold.woff2 new file mode 100644 index 0000000..ccbefc8 Binary files /dev/null and b/assets/fonts/fira-code/woff2/FiraCode-SemiBold.woff2 differ diff --git a/assets/fonts/fira-code/woff2/FiraCode-VF.woff2 b/assets/fonts/fira-code/woff2/FiraCode-VF.woff2 new file mode 100644 index 0000000..e755a9d Binary files /dev/null and b/assets/fonts/fira-code/woff2/FiraCode-VF.woff2 differ diff --git a/assets/icons/close_big.svg b/assets/icons/close_big.svg new file mode 100644 index 0000000..d1cf7fb --- /dev/null +++ b/assets/icons/close_big.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/cookie.svg b/assets/icons/cookie.svg new file mode 100644 index 0000000..a86710d --- /dev/null +++ b/assets/icons/cookie.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/info_circle_outline.svg b/assets/icons/info_circle_outline.svg new file mode 100644 index 0000000..419eb6c --- /dev/null +++ b/assets/icons/info_circle_outline.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/icons/mail.svg b/assets/icons/mail.svg new file mode 100644 index 0000000..4e6fadd --- /dev/null +++ b/assets/icons/mail.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/settings.svg b/assets/icons/settings.svg new file mode 100644 index 0000000..6aa67ab --- /dev/null +++ b/assets/icons/settings.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/short_left.svg b/assets/icons/short_left.svg new file mode 100644 index 0000000..e5bb90b --- /dev/null +++ b/assets/icons/short_left.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/trash_full.svg b/assets/icons/trash_full.svg new file mode 100644 index 0000000..b8cf79a --- /dev/null +++ b/assets/icons/trash_full.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/warning.svg b/assets/icons/warning.svg new file mode 100644 index 0000000..de8e706 --- /dev/null +++ b/assets/icons/warning.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/logo-internet-czas-dzialac.svg b/assets/logo-internet-czas-dzialac.svg new file mode 100644 index 0000000..061933c --- /dev/null +++ b/assets/logo-internet-czas-dzialac.svg @@ -0,0 +1,777 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/esbuild.config.js b/esbuild.config.js new file mode 100644 index 0000000..8f38539 --- /dev/null +++ b/esbuild.config.js @@ -0,0 +1,29 @@ +import esbuild from 'esbuild'; +import scss from 'esbuild-plugin-sass'; +import svg from 'esbuild-plugin-svgr'; + +esbuild + .build({ + entryPoints: [ + 'sidebar/sidebar.tsx', + 'test.ts', + 'report-window/report-window.tsx', + 'background.ts', + ], + bundle: true, + outdir: './lib', + loader: { '.woff': 'file', '.woff2': 'file' }, + plugins: [scss(), svg()], + watch: { + onRebuild(error, result) { + try { + console.log('watch build succeeded:', result); + } catch (error) { + console.error('watch build failed:', error); + } + }, + }, + }) + .catch(() => process.exit(1)); + +// npx esbuild sidebar/sidebar.tsx test.ts --bundle report-window/report-window.tsx --bundle background.ts --bundle --outdir=./lib diff --git a/icons/logo-black-square.png b/icons/logo-black-square.png new file mode 100644 index 0000000..0ecc301 Binary files /dev/null and b/icons/logo-black-square.png differ diff --git a/icons/logo-black-square.svg b/icons/logo-black-square.svg new file mode 100644 index 0000000..996111e --- /dev/null +++ b/icons/logo-black-square.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + + Pr + . + + + + + + diff --git a/manifest.json b/manifest.json index f9086cc..2b2ad73 100644 --- a/manifest.json +++ b/manifest.json @@ -1,33 +1,35 @@ { - "manifest_version": 2, - "name": "Problematyczne requesty", - "version": "1.0", + "manifest_version": 2, + "name": "Problematyczne requesty", + "version": "1.0", - "description": "Adds a red border to all webpages matching mozilla.org.", + "description": "", - "sidebar_action": { - "default_title": "ICD Skaner", - "default_panel": "sidebar/sidebar.html", - "default_icon": "sidebar_icon.png" - }, - "background": { - "scripts": ["lib/background.js"] - }, - "icons": { - "48": "icons/border-48.png" - }, - "permissions": [ - "proxy", - "storage", - "", - "webRequest", - "webRequestBlocking", - "cookies", - "privacy" - ], - "browser_specific_settings": { - "gecko": { - "id": "problematic-requests@internet-czas-dzialac.pl" + "sidebar_action": { + "default_title": "Problematic requests", + "default_panel": "sidebar/sidebar.html", + "default_icon": "icons/logo-black-square.svg", + "browser_style": true, + "open_at_install": true + }, + "background": { + "scripts": ["lib/background.js"] + }, + "icons": { + "48": "icons/border-48.png" + }, + "permissions": [ + "proxy", + "storage", + "", + "webRequest", + "webRequestBlocking", + "cookies", + "privacy" + ], + "browser_specific_settings": { + "gecko": { + "id": "problematic-requests@internet-czas-dzialac.pl" + } } - } } diff --git a/memory.ts b/memory.ts index 6db0ad0..92c86ec 100644 --- a/memory.ts +++ b/memory.ts @@ -56,7 +56,7 @@ export default class Memory extends EventEmitter { } return true; } catch (e) { - debugger; + // debugger; } } diff --git a/options.scss b/options.scss new file mode 100644 index 0000000..81a71d6 --- /dev/null +++ b/options.scss @@ -0,0 +1,30 @@ +@import './sidebar/colors.scss'; + +.options-container { + padding-top: 0.5rem; + span { + color: $mid-grey; + font-size: 0.875rem; + font-weight: 600; + } + + fieldset { + padding: 0.5rem 0 1rem; + border: none; + display: flex; + flex-flow: column; + + .label-checkbox { + cursor: pointer; + margin-left: 0.5rem; + } + + .input-container { + padding-bottom: 0.25rem; + } + + #minValueLength { + width: 3rem; + } + } +} diff --git a/options.tsx b/options.tsx index cd723ce..951aec3 100644 --- a/options.tsx +++ b/options.tsx @@ -1,50 +1,115 @@ -import React from "react"; +import React from 'react'; +import './options.scss'; export default function Options({ - minValueLength, - setMinValueLength, - cookiesOnly, - setCookiesOnly, - cookiesOrOriginOnly, - setCookiesOrOriginOnly, + minValueLength, + setMinValueLength, + cookiesOnly, + setCookiesOnly, + cookiesOrOriginOnly, + setCookiesOrOriginOnly, + warningDataDialogAck, + setWarningDataDialogAck, + logoVisibility, + setLogoVisibility, }: { - minValueLength: number; - setMinValueLength: (n: number) => void; - cookiesOnly: boolean; - setCookiesOnly: (b: boolean) => void; - cookiesOrOriginOnly: boolean; - setCookiesOrOriginOnly: (b: boolean) => void; + minValueLength: number; + setMinValueLength: (n: number) => void; + cookiesOnly: boolean; + setCookiesOnly: (b: boolean) => void; + cookiesOrOriginOnly: boolean; + setCookiesOrOriginOnly: (b: boolean) => void; + warningDataDialogAck: boolean; + setWarningDataDialogAck: (b: boolean) => void; + logoVisibility: boolean; + setLogoVisibility: (b: boolean) => void; }) { - return ( -
-

Zaawansowane ustawienia

- - setMinValueLength(parseInt(e.target.value))} - /> -
- setCookiesOnly(e.target.checked)} - /> - -
- setCookiesOrOriginOnly(e.target.checked)} - /> - -
- ); + return ( +
+ Interfejs +
+
+ { + setLogoVisibility(e.target.checked); + localStorage.setItem( + 'logoVisibility', + e.target.checked as unknown as string + ); + }} + /> + +
+
+ { + setWarningDataDialogAck(e.target.checked); + localStorage.setItem( + 'warningDataDialogAck', + e.target.checked as unknown as string + ); + }} + /> + +
+
+ Ustawienia zaawansowane +
+
+ + + setMinValueLength(parseInt(e.target.value)) + } + /> +
+
+ setCookiesOnly(e.target.checked)} + /> + +
+
+ + setCookiesOrOriginOnly(e.target.checked) + } + /> + +
+
+
+ ); } diff --git a/package-lock.json b/package-lock.json index 3229bba..00e3b79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,20 +20,563 @@ "devDependencies": { "@types/events": "^3.0.0", "@types/react-dom": "^17.0.9", + "esbuild-plugin-sass": "^1.0.1", + "esbuild-plugin-svgr": "^1.0.0", "web-ext-types": "^3.2.1" } }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", + "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.7", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@iabtcf/core": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.3.1.tgz", "integrity": "sha512-t3ZvQRXLhoze2cx15mZMt5wUVhj+q3CoXtSSdZuVbrEbnyzFJ6uW0fxr5dmH1vRud7QYGRXqjhCBL7Yr46VRpA==" }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", + "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", + "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", + "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", + "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", + "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", + "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", + "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.0.0", + "@svgr/babel-plugin-transform-svg-component": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.0.tgz", + "integrity": "sha512-n5PrYAPoTpWGykqa8U05/TVTHOrVR/TxrUJ5EWHP9Db6vR3qnqzwAVLiFT1+slA7zQoJTXafQb+akwThf9SxGw==", + "dev": true, + "dependencies": { + "@svgr/plugin-jsx": "^6.2.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.0.0.tgz", + "integrity": "sha512-S+TxtCdDyRGafH1VG1t/uPZ87aOYOHzWL8kqz4FoSZcIbzWA6rnOmjNViNiDzqmEpzp2PW5o5mZfvC9DiVZhTQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.6", + "entities": "^3.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.0.tgz", + "integrity": "sha512-QJDEe7K5Hkd4Eewu4pcjiOKTCtjB47Ol6lDLXVhf+jEewi+EKJAaAmM+bNixfW6LSNEg8RwOYQN3GZcprqKfHw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.15.5", + "@svgr/babel-preset": "^6.2.0", + "@svgr/hast-util-to-babel-ast": "^6.0.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, "node_modules/@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", "dev": true }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "node_modules/@types/prop-types": { "version": "15.7.4", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", @@ -71,12 +614,254 @@ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001300", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", + "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/csstype": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==", "dev": true }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.46", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.46.tgz", + "integrity": "sha512-UtV0xUA/dibCKKP2JMxOpDtXR74zABevuUEH4K0tvduFSIoxRVcYmQsbB51kXsFTX8MmOyWMt8tuZAlmDOqkrQ==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/esbuild": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.3.tgz", @@ -248,6 +1033,30 @@ "openbsd" ] }, + "node_modules/esbuild-plugin-sass": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esbuild-plugin-sass/-/esbuild-plugin-sass-1.0.1.tgz", + "integrity": "sha512-YFxjzD9Z1vz92QCJcAmCO15WVCUiOobw9ypdVeMsW+xa6S+zqryLUIh8d3fe/UkRHRO5PODZz/3xDAQuEXZwmQ==", + "dev": true, + "dependencies": { + "css-tree": "1.1.3", + "fs-extra": "10.0.0", + "sass": "1.47.0", + "tmp": "0.2.1" + }, + "peerDependencies": { + "esbuild": ">=0.11.14" + } + }, + "node_modules/esbuild-plugin-svgr": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-svgr/-/esbuild-plugin-svgr-1.0.0.tgz", + "integrity": "sha512-ILJ/Pk/e0sCNNnmoxMwqIUFR+91Vb456EQzVv+d8RS18P3xisfP82qoxjpNYBK2QwRi9pVzvLWNg1zzIo0eq1g==", + "dev": true, + "dependencies": { + "@svgr/core": "^6.1.2" + } + }, "node_modules/esbuild-sunos-64": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.3.tgz", @@ -296,6 +1105,24 @@ "win32" ] }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -304,11 +1131,259 @@ "node": ">=0.8.x" } }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -320,6 +1395,51 @@ "loose-envify": "cli.js" } }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -328,6 +1448,81 @@ "node": ">=0.10.0" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -353,6 +1548,65 @@ "react": "17.0.2" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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/sass": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.47.0.tgz", + "integrity": "sha512-GtXwvwgD7/6MLUZPnlA5/8cdRgC9SzT5kAnnJMRmEZQFRE3J56Foswig4NyyyQGsnmNvg6EUM/FP0Pe9Y2zywQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, "node_modules/scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -362,30 +1616,488 @@ "object-assign": "^4.1.1" } }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, "node_modules/tai-password-strength": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tai-password-strength/-/tai-password-strength-1.1.3.tgz", "integrity": "sha512-GZVtM7wEbgp9IZ9CkdGbpnx0MflFDonzehQIPO0tx3KXMq1ImLiLK33N+ziC4rm8BVd7jrq93kBCOP6VJ4DdzA==" }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/web-ext-types": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-ext-types/-/web-ext-types-3.2.1.tgz", "integrity": "sha512-oQZYDU3W8X867h8Jmt3129kRVKklz70db40Y6OzoTTuzOJpF/dB2KULJUf0txVPyUUXuyzV8GmT3nVvRHoG+Ew==", "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "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, + "engines": { + "node": ">= 6" + } } }, "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", + "dev": true + }, + "@babel/core": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", + "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.7", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true + }, + "@babel/helpers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, "@iabtcf/core": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@iabtcf/core/-/core-1.3.1.tgz", "integrity": "sha512-t3ZvQRXLhoze2cx15mZMt5wUVhj+q3CoXtSSdZuVbrEbnyzFJ6uW0fxr5dmH1vRud7QYGRXqjhCBL7Yr46VRpA==" }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", + "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", + "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", + "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", + "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", + "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", + "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", + "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", + "dev": true, + "requires": {} + }, + "@svgr/babel-preset": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", + "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", + "dev": true, + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "^6.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "^6.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "^6.0.0", + "@svgr/babel-plugin-transform-svg-component": "^6.2.0" + } + }, + "@svgr/core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.0.tgz", + "integrity": "sha512-n5PrYAPoTpWGykqa8U05/TVTHOrVR/TxrUJ5EWHP9Db6vR3qnqzwAVLiFT1+slA7zQoJTXafQb+akwThf9SxGw==", + "dev": true, + "requires": { + "@svgr/plugin-jsx": "^6.2.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.0.0.tgz", + "integrity": "sha512-S+TxtCdDyRGafH1VG1t/uPZ87aOYOHzWL8kqz4FoSZcIbzWA6rnOmjNViNiDzqmEpzp2PW5o5mZfvC9DiVZhTQ==", + "dev": true, + "requires": { + "@babel/types": "^7.15.6", + "entities": "^3.0.1" + }, + "dependencies": { + "entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true + } + } + }, + "@svgr/plugin-jsx": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.0.tgz", + "integrity": "sha512-QJDEe7K5Hkd4Eewu4pcjiOKTCtjB47Ol6lDLXVhf+jEewi+EKJAaAmM+bNixfW6LSNEg8RwOYQN3GZcprqKfHw==", + "dev": true, + "requires": { + "@babel/core": "^7.15.5", + "@svgr/babel-preset": "^6.2.0", + "@svgr/hast-util-to-babel-ast": "^6.0.0", + "svg-parser": "^2.0.2" + } + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", "dev": true }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, "@types/prop-types": { "version": "15.7.4", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz", @@ -423,12 +2135,197 @@ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001300", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", + "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, "csstype": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==", "dev": true }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "electron-to-chromium": { + "version": "1.4.46", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.46.tgz", + "integrity": "sha512-UtV0xUA/dibCKKP2JMxOpDtXR74zABevuUEH4K0tvduFSIoxRVcYmQsbB51kXsFTX8MmOyWMt8tuZAlmDOqkrQ==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, "esbuild": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.3.tgz", @@ -524,6 +2421,27 @@ "integrity": "sha512-HVpkgpn4BQt4BPDAjTOpeMub6mzNWw6Y3gaLQJrpbO24pws6ZwYkY24OI3/Uo3LDCbH6856MM81JxECt92OWjA==", "optional": true }, + "esbuild-plugin-sass": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esbuild-plugin-sass/-/esbuild-plugin-sass-1.0.1.tgz", + "integrity": "sha512-YFxjzD9Z1vz92QCJcAmCO15WVCUiOobw9ypdVeMsW+xa6S+zqryLUIh8d3fe/UkRHRO5PODZz/3xDAQuEXZwmQ==", + "dev": true, + "requires": { + "css-tree": "1.1.3", + "fs-extra": "10.0.0", + "sass": "1.47.0", + "tmp": "0.2.1" + } + }, + "esbuild-plugin-svgr": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-svgr/-/esbuild-plugin-svgr-1.0.0.tgz", + "integrity": "sha512-ILJ/Pk/e0sCNNnmoxMwqIUFR+91Vb456EQzVv+d8RS18P3xisfP82qoxjpNYBK2QwRi9pVzvLWNg1zzIo0eq1g==", + "dev": true, + "requires": { + "@svgr/core": "^6.1.2" + } + }, "esbuild-sunos-64": { "version": "0.13.3", "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.3.tgz", @@ -548,16 +2466,213 @@ "integrity": "sha512-nP7H0Y2a6OJd3Qi1Q8sehhyP4x4JoXK4S5y6FzH2vgaJgiyEurzFxjUufGdMaw+RxtxiwD/uRndUgwaZ2JD8lg==", "optional": true }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "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 + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -566,11 +2681,104 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, "react": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", @@ -590,6 +2798,47 @@ "scheduler": "^0.20.2" } }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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 + }, + "sass": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.47.0.tgz", + "integrity": "sha512-GtXwvwgD7/6MLUZPnlA5/8cdRgC9SzT5kAnnJMRmEZQFRE3J56Foswig4NyyyQGsnmNvg6EUM/FP0Pe9Y2zywQ==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, "scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -599,16 +2848,91 @@ "object-assign": "^4.1.1" } }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, "tai-password-strength": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tai-password-strength/-/tai-password-strength-1.1.3.tgz", "integrity": "sha512-GZVtM7wEbgp9IZ9CkdGbpnx0MflFDonzehQIPO0tx3KXMq1ImLiLK33N+ziC4rm8BVd7jrq93kBCOP6VJ4DdzA==" }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, "web-ext-types": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-ext-types/-/web-ext-types-3.2.1.tgz", "integrity": "sha512-oQZYDU3W8X867h8Jmt3129kRVKklz70db40Y6OzoTTuzOJpF/dB2KULJUf0txVPyUUXuyzV8GmT3nVvRHoG+Ew==", "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true } } } diff --git a/package.json b/package.json index 38a4596..c9f45e2 100644 --- a/package.json +++ b/package.json @@ -2,15 +2,16 @@ "name": "problematic-requests", "version": "1.0.0", "description": "", - "main": "email-template-harsh.js", + "main": "esbuild.config.js", + "type": "module", "scripts": { - "build": "npx esbuild sidebar/sidebar.tsx test.ts --bundle report-window/report-window.tsx --bundle background.ts --bundle --outdir=./lib", + "build": "node esbuild.config.js", "watch": "npm run build -- --watch", "typecheck": "tsc --noEmit" }, "repository": { "type": "git", - "url": "https://git.kuba-orlik.name/kuba/problematic-requests.git" + "url": "https://git.internet-czas-dzialac.pl/icd/problematic-requests.git" }, "author": "", "license": "ISC", @@ -26,6 +27,8 @@ "devDependencies": { "@types/events": "^3.0.0", "@types/react-dom": "^17.0.9", + "esbuild-plugin-sass": "^1.0.1", + "esbuild-plugin-svgr": "^1.0.0", "web-ext-types": "^3.2.1" } } diff --git a/report-window/domain-summary.tsx b/report-window/domain-summary.tsx index 62ee570..0d0446a 100644 --- a/report-window/domain-summary.tsx +++ b/report-window/domain-summary.tsx @@ -1,41 +1,42 @@ -import React from "react"; -import { RequestCluster } from "../request-cluster"; -import { Classifications, Sources } from "../stolen-data-entry"; +import React from 'react'; +import { RequestCluster } from '../request-cluster'; +import { Classifications, Sources } from '../stolen-data-entry'; const emailClassifications: Record = { - id: "mój identyfikator internetowy", - history: "część mojej historii przeglądania", - location: "informacje na temat mojej lokalizacji geograficznej", + id: 'mój identyfikator internetowy', + history: 'część mojej historii przeglądania', + location: 'informacje na temat mojej lokalizacji geograficznej', }; const emailSources: Record = { - header: "w nagłówku HTTP", - cookie: "z pliku Cookie", - pathname: "jako części adresu URL", - queryparams: "jako część adresu URL (query-params)", - request_body: "w body zapytania POST", + header: 'w nagłówku HTTP', + cookie: 'z pliku Cookie', + pathname: 'jako części adresu URL', + queryparams: 'jako część adresu URL (query-params)', + request_body: 'w body zapytania POST', }; export default function DomainSummary({ - cluster, + cluster, }: { - cluster: RequestCluster; + cluster: RequestCluster; }) { - return ( -
  • - Właścicielowi domeny {cluster.id} zostały ujawnione:{" "} -
      -
    • Mój adres IP
    • - {cluster.representativeStolenData - .filter((entry) => entry.isMarked) - .map((entry) => ( -
    • - {emailClassifications[entry.classification]}{" "} - {emailSources[entry.source]} (nazwa: {entry.name},{" "} - wartość: {entry.getValuePreview()}) -
    • - ))} -
    -
  • - ); + return ( +
  • + Właścicielowi domeny {cluster.id} zostały + ujawnione:{' '} +
      + {cluster.representativeStolenData + .filter((entry) => entry.isMarked) + .map((entry) => ( +
    • + {emailClassifications[entry.classification]}{' '} + {emailSources[entry.source]} (nazwa:{' '} + {entry.name}, wartość:{' '} + {entry.getValuePreview()}) +
    • + ))} +
    +
  • + ); } diff --git a/report-window/email-template-1.tsx b/report-window/email-template-1.tsx index df0fb0f..5bfabd3 100644 --- a/report-window/email-template-1.tsx +++ b/report-window/email-template-1.tsx @@ -1,215 +1,232 @@ -import React from "react"; -import { useState } from "react"; -import { RequestCluster } from "../request-cluster"; -import { StolenDataEntry } from "../stolen-data-entry"; -import { getDate, toBase64 } from "../util"; -import DomainSummary from "./domain-summary"; +import React from 'react'; +import { useState } from 'react'; +import { RequestCluster } from '../request-cluster'; +import { StolenDataEntry } from '../stolen-data-entry'; +import { getDate, toBase64 } from '../util'; +import DomainSummary from './domain-summary'; -type PopupState = "not_clicked" | "clicked_but_no_reject_all"; +type PopupState = 'not_clicked' | 'clicked_but_no_reject_all'; export default function EmailTemplate1({ - entries, - clusters, + entries, + clusters, }: { - entries: StolenDataEntry[]; - clusters: Record; - version: number; + entries: StolenDataEntry[]; + clusters: Record; + version: number; }): JSX.Element { - const [popupState, setPopupState] = useState("not_clicked"); - const [acceptAllName, setAcceptAllName] = useState( - "Zaakceptuj wszystkie" - ); - const [popupScreenshotBase64, setPopupScreenshotBase64] = - useState(null); + const [popupState, setPopupState] = useState('not_clicked'); + const [acceptAllName, setAcceptAllName] = useState( + 'Zaakceptuj wszystkie' + ); + const [popupScreenshotBase64, setPopupScreenshotBase64] = + useState(null); - return ( -
    - - - {popupState === "clicked_but_no_reject_all" ? ( - <> -
    - - setAcceptAllName(e.target.value), - }} - /> -
    -
    - - { - setPopupScreenshotBase64(await toBase64(e.target.files[0])); - }, - }} - /> -
    - - ) : null} -

    - Dzień dobry, w dniu {getDate()} odwiedziłem stronę{" "} - {entries[0].request.originalURL}. Strona ta wysłała moje dane osobowe do - podmiotów trzecich - bez mojej zgody.{" "} -

    -
      - {Object.values(clusters) - .filter((cluster) => cluster.hasMarks()) - .map((cluster) => ( - - ))} -
    -

    - {" "} - Dane te zostały wysłane przez Państwa stronę - a mówiąc dokładniej, - przez zamieszczone przez Państwa na tej stronie skrypty. -

    - {popupState === "not_clicked" ? ( -

    - Nastąpiło to, zanim zdążyłem w ogóle przeczytać treść wyskakującego - okienka ze zgodami i zanim miałem szansę wyrazić sprzeciw takiemu - przetwarzaniu danych osobowych. -

    - ) : null} - {popupState === "clicked_but_no_reject_all" ? ( -

    - O ile po wejściu na stronę wcisnąłem w wyskakującym okienku przycisk „ - {acceptAllName}”, o tyle nie stanowi to według mnie ważnej w świetle - RODO zgody, gdyż brakowało w tym okienku równie łatwo osiągalnego - przycisku, którego kliknięcie skutkowałoby zasygnalizowaniem braku - mojej zgody na takie przetwarzanie moich danych. Mówiąc wprost - - wyrażenie „zgody” było łatwiejsze niż jej niewyrażenie. Niewyrażenie - zgody wiąże się z negatywną konsekwencją konieczności przechodzenia - przez dodatkowe kroki w wyskakującym okienku. Zatem tak otrzymana - przez Państwo moja „zgoda” nie jest poprawną podstawą prawną do - przetwarzania moich danych osobowych, gdyż nie spełnia warunku - dobrowolności wspomnianego w Art. 4. pkt 11{" "} - - rozporządzenia Parlamentu Europejskiego i Rady (UE) 2016/679 z dnia - 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z - przetwarzaniem danych osobowych i w sprawie swobodnego przepływu - takich danych oraz uchylenia dyrektywy 95/46/WE - - .{} -

    - ) : null} -

    - Udokumentowałem to na zrzutach ekranu z mojej przeglądarki internetowej, - które to zrzuty przesyłam w załączeniu. -

    -

    - Wiem, że nie wszystkie rodzaje przetwarzania danych wymagają zgody - użytkownika. W kontekście stron internetowych z wymienionych w Art. 6. - pkt 1. RODO mogą mieć zastosowanie albo „zgoda” (Art. 6. pkt 1. lit. - a)), albo niezbędność tego przetwarzania do wykonania umowy (Art. 6. pkt - 1. lit. b)), albo uzasadniony interes (Art. 6. pkt 1. lit. f)). Wiem - też, że każda z tych podstaw prawnych ma moc dopiero po spełnieniu - określonych warunków. -

    -

    - Nie widzę ważnej podstawy prawnej legalizującej procesy przetwarzania - moich danych osobowych, jakie wymieniłem powyżej (na pewno nie jest to - przetwarzanie konieczne do wyświetlenia strony z technicznego punktu - widzenia). Jeżeli takie przesłanki legalizujące jednak występują, proszę - o ich wskazanie, - - {" "} - dla każdego z celów i podmiotów z osobna - - . -

    -

    - Jeżeli wskazaną przez Państwa przesłanką legalizującą dany element - procesu przetwarzania danych osobowych przez Państwa stronę jest Art 6. - pkt 1 lit. a) RODO (zgoda), na mocy Art. 7 pkt 1 RODO proszę o - wykazanie, że udzieliłem Państwu zgodę na takie przetwarzanie moich - danych osobowych zanim to przetwarzanie nastąpiło, oraz że ta zgoda jest - ważna w świetle RODO (odnosząc się w szczególności do art. 7 ust. 3 - RODO). Z góry zaznaczam, że „ustawienia przeglądarki” nie stanowią - ważnej w świetle RODO zgody. -

    -

    - Jeżeli wskazaną przez Państwa przesłanką legalizującą dany element - procesu przetwarzania danych osobowych przez Państwa stronę jest Art 6. - pkt 1 lit. b) RODO (niezbędność takiego przetwarzania do wykonania - umowy), proszę o wskazanie, w jaki sposób ta konieczność zachodzi, oraz - co sprawia, że Państwa zdaniem nie można wykonać umowy związanej z - wyświetleniem Państwa strony bez przekazywania identyfikatora - internetowego z plików Cookies lub historii przeglądania w nagłówku - Referer do wskazanych podmiotów trzecich. -

    -

    - Jeżeli wskazaną przez Państwa przesłanką legalizującą dany element - procesu przetwarzania danych osobowych przez Państwa stronę jest Art 6. - pkt 1 lit. f) RODO (uzasadniony interes), proszę o wskazanie, jaki to - jest konkretny interes (prosze o bardziej dokładny opis - niż np. tylko "marketing"), oraz o wynik testu równowagi pomiędzy - Państwa interesem a moimi podstawowymi wolnościami i prawami - ze - wskazaniem tego, co sprawia, że w Państwa ocenie Państwa uzasadniony - interes przeważa moje prawa i interesy w kontekście wspomnianych powyżej - procesów przetwarzania danych. Proszę też pamiętać, że aby w ramach - danego celu przetwarzania powołać się na prawnie uzasadniony interes, - powinni mi Państo umożliwić wyrażenie sprzeciwu wobec przetwarzania - moich danych w tym celu przed rozpoczęciem przetwarzania - zob.{" "} - - Wytyczne 8/2020 Europejskiej Rady Ochrony Danych dotyczące - targetowania użytkowników mediów społecznościowych - -

    -

    - Niniejszym zwracam się także z żądaniem ujawnienia tożsamości podmiotów, - które są właścicielami wyżej wymienionych domen, abym mógł zapoznać się - z ich politykami prywatności i zwrócić się do tych podmiotów o usunięcie - z ich baz wysłanych przez Państwa stronę moich danych. -

    -

    - Proszę też o wysłanie kopii danych zebranych na mój temat i wysłanych do - wyżej wymienionych podmiotów. -

    -

    - W odpowiedzi proszę się nie powoływać na IAB Europe i ich rzekomą renomę - w tworzeniu rozwiązań zgodnych z RODO. IAB chroni interes reklamodawców, - a nie Użytkowników, i ich rozwiązania (np. TCF) są{" "} - - notorycznie niezgodne z RODO i pozbawione szacunku dla Użytkowników - - . -

    -

    - Apeluję także o wprowadzenie stosownych zmian na stronie tak, aby nie - pozostawiać cienia wątpliwości odnośnie tego, na mocy jakiej przesłanki - legalizującej dane są przetwarzane przez wspomniane podmioty trzecie, - lub tak, aby te dane po prostu nie były wysyłane. Pomoże to zachować - prywatność innym użytkownikom Państwa strony. Polecam Państwa uwadze - oficjalne wytyczne EROD dotyczące zgody w kontekście RODO: - https://edpb.europa.eu/sites/default/files/files/file1/edpb_guidelines_202005_consent_pl.pdf - ). Aby na przykład zapobiec automatycznemu wysyłaniu historii - przeglądania do podmiotów trzecich przez Państwa stronę, można po prostu - ustawić odpowiednio treść nagłówka{" "} - - Referrer-Policy{" "} - - . -

    -
    - ); + return ( +
    + + + {popupState === 'clicked_but_no_reject_all' ? ( + <> +
    + + + setAcceptAllName(e.target.value), + }} + /> +
    +
    + + { + setPopupScreenshotBase64( + await toBase64(e.target.files[0]) + ); + }, + }} + /> +
    + + ) : null} +

    + Dzień dobry, w dniu {getDate()} odwiedziłem stronę{' '} + {entries[0].request.originalURL}. Strona ta wysłała moje dane + osobowe do podmiotów trzecich - bez mojej zgody.{' '} +

    +
      + {Object.values(clusters) + .filter((cluster) => cluster.hasMarks()) + .map((cluster) => ( + + ))} +
    +

    + {' '} + Dane te zostały wysłane przez Państwa stronę - a mówiąc + dokładniej, przez zamieszczone przez Państwa na tej stronie + skrypty. +

    + {popupState === 'not_clicked' ? ( +

    + Nastąpiło to, zanim zdążyłem w ogóle przeczytać treść + wyskakującego okienka ze zgodami i zanim miałem szansę + wyrazić sprzeciw takiemu przetwarzaniu danych osobowych. +

    + ) : null} + {popupState === 'clicked_but_no_reject_all' ? ( +

    + O ile po wejściu na stronę wcisnąłem w wyskakującym okienku + przycisk „{acceptAllName}”, o tyle nie stanowi to według + mnie ważnej w świetle RODO zgody, gdyż brakowało w tym + okienku równie łatwo osiągalnego przycisku, którego + kliknięcie skutkowałoby zasygnalizowaniem braku mojej zgody + na takie przetwarzanie moich danych. Mówiąc wprost - + wyrażenie „zgody” było łatwiejsze niż jej niewyrażenie. + Niewyrażenie zgody wiąże się z negatywną konsekwencją + konieczności przechodzenia przez dodatkowe kroki w + wyskakującym okienku. Zatem tak otrzymana przez Państwo moja + „zgoda” nie jest poprawną podstawą prawną do przetwarzania + moich danych osobowych, gdyż nie spełnia warunku + dobrowolności wspomnianego w Art. 4. pkt 11{' '} + + rozporządzenia Parlamentu Europejskiego i Rady (UE) + 2016/679 z dnia 27 kwietnia 2016 r. w sprawie ochrony + osób fizycznych w związku z przetwarzaniem danych + osobowych i w sprawie swobodnego przepływu takich danych + oraz uchylenia dyrektywy 95/46/WE + + .{} +

    + ) : null} +

    + Udokumentowałem to na zrzutach ekranu z mojej przeglądarki + internetowej, które to zrzuty przesyłam w załączeniu. +

    +

    + Wiem, że nie wszystkie rodzaje przetwarzania danych wymagają + zgody użytkownika. W kontekście stron internetowych z + wymienionych w Art. 6. pkt 1. RODO mogą mieć zastosowanie albo + „zgoda” (Art. 6. pkt 1. lit. a)), albo niezbędność tego + przetwarzania do wykonania umowy (Art. 6. pkt 1. lit. b)), albo + uzasadniony interes (Art. 6. pkt 1. lit. f)). Wiem też, że każda + z tych podstaw prawnych ma moc dopiero po spełnieniu określonych + warunków. +

    +

    + Nie widzę ważnej podstawy prawnej legalizującej procesy + przetwarzania moich danych osobowych, jakie wymieniłem powyżej + (na pewno nie jest to przetwarzanie konieczne do wyświetlenia + strony z technicznego punktu widzenia). Jeżeli takie przesłanki + legalizujące jednak występują, proszę o ich wskazanie, + + {' '} + dla każdego z celów i podmiotów z osobna + + . +

    +

    + Jeżeli wskazaną przez Państwa przesłanką legalizującą dany + element procesu przetwarzania danych osobowych przez Państwa + stronę jest Art 6. pkt 1 lit. a) RODO (zgoda), na mocy Art. 7 + pkt 1 RODO proszę o wykazanie, że udzieliłem Państwu zgodę na + takie przetwarzanie moich danych osobowych zanim to + przetwarzanie nastąpiło, oraz że ta zgoda jest ważna w świetle + RODO (odnosząc się w szczególności do art. 7 ust. 3 RODO). Z + góry zaznaczam, że „ustawienia przeglądarki” nie stanowią ważnej + w świetle RODO zgody. +

    +

    + Jeżeli wskazaną przez Państwa przesłanką legalizującą dany + element procesu przetwarzania danych osobowych przez Państwa + stronę jest Art 6. pkt 1 lit. b) RODO (niezbędność takiego + przetwarzania do wykonania umowy), proszę o wskazanie, w jaki + sposób ta konieczność zachodzi, oraz co sprawia, że Państwa + zdaniem nie można wykonać umowy związanej z wyświetleniem + Państwa strony bez przekazywania identyfikatora internetowego z + plików Cookies lub historii przeglądania w nagłówku Referer do + wskazanych podmiotów trzecich. +

    +

    + Jeżeli wskazaną przez Państwa przesłanką legalizującą dany + element procesu przetwarzania danych osobowych przez Państwa + stronę jest Art 6. pkt 1 lit. f) RODO (uzasadniony interes), + proszę o wskazanie, jaki to jest{' '} + konkretny interes (prosze o bardziej dokładny + opis niż np. tylko "marketing"), oraz o wynik testu równowagi + pomiędzy Państwa interesem a moimi podstawowymi wolnościami i + prawami - ze wskazaniem tego, co sprawia, że w Państwa ocenie + Państwa uzasadniony interes przeważa moje prawa i interesy w + kontekście wspomnianych powyżej procesów przetwarzania danych. + Proszę też pamiętać, że aby w ramach danego celu przetwarzania + powołać się na prawnie uzasadniony interes, powinni mi Państo + umożliwić wyrażenie sprzeciwu wobec przetwarzania moich danych w + tym celu przed rozpoczęciem przetwarzania - zob.{' '} + + Wytyczne 8/2020 Europejskiej Rady Ochrony Danych dotyczące + targetowania użytkowników mediów społecznościowych + +

    +

    + Niniejszym zwracam się także z żądaniem ujawnienia tożsamości + podmiotów, które są właścicielami wyżej wymienionych domen, abym + mógł zapoznać się z ich politykami prywatności i zwrócić się do + tych podmiotów o usunięcie z ich baz wysłanych przez Państwa + stronę moich danych. +

    +

    + Proszę też o wysłanie kopii danych zebranych na mój temat i + wysłanych do wyżej wymienionych podmiotów. +

    +

    + W odpowiedzi proszę się nie powoływać na IAB Europe i ich + rzekomą renomę w tworzeniu rozwiązań zgodnych z RODO. IAB chroni + interes reklamodawców, a nie Użytkowników, i ich rozwiązania + (np. TCF) są{' '} + + notorycznie niezgodne z RODO i pozbawione szacunku dla + Użytkowników + + . +

    +

    + Apeluję także o wprowadzenie stosownych zmian na stronie tak, + aby nie pozostawiać cienia wątpliwości odnośnie tego, na mocy + jakiej przesłanki legalizującej dane są przetwarzane przez + wspomniane podmioty trzecie, lub tak, aby te dane po prostu nie + były wysyłane. Pomoże to zachować prywatność innym użytkownikom + Państwa strony. Polecam Państwa uwadze oficjalne wytyczne EROD + dotyczące zgody w kontekście RODO: + https://edpb.europa.eu/sites/default/files/files/file1/edpb_guidelines_202005_consent_pl.pdf + ). Aby na przykład zapobiec automatycznemu wysyłaniu historii + przeglądania do podmiotów trzecich przez Państwa stronę, można + po prostu ustawić odpowiednio treść nagłówka{' '} + + Referrer-Policy{' '} + + . +

    +
    + ); } diff --git a/report-window/email-template-2-controls.tsx b/report-window/email-template-2-controls.tsx index 23b1e09..804755f 100644 --- a/report-window/email-template-2-controls.tsx +++ b/report-window/email-template-2-controls.tsx @@ -1,163 +1,170 @@ -import React from "react"; -import { Dispatch, SetStateAction } from "react"; -import { toBase64 } from "../util"; -import { EmailTemplate2Config } from "./email-template-2"; +import React from 'react'; +import { Dispatch, SetStateAction } from 'react'; +import { toBase64 } from '../util'; +import { EmailTemplate2Config } from './email-template-2'; export default function EmailTemplate2Controls({ - config, - setConfig, + config, + setConfig, }: { - config: EmailTemplate2Config; - setConfig: Dispatch>; + config: EmailTemplate2Config; + setConfig: Dispatch>; }): JSX.Element { - return ( -
    -
    - - -
    - {config.popup_type !== "none" ? ( + return (
    - - { - const popup_screenshot_base64 = await toBase64( - e.target.files[0] - ); - setConfig((v) => ({ - ...v, - popup_screenshot_base64, - })); - }, - }} - /> +
    + + +
    + {config.popup_type !== 'none' ? ( +
    + + { + const popup_screenshot_base64 = await toBase64( + e.target.files[0] + ); + setConfig((v) => ({ + ...v, + popup_screenshot_base64, + })); + }, + }} + /> +
    + ) : ( + '' + )} + {config.popup_type === 'consent' ? ( +
    + + + setConfig((v) => ({ + ...v, + popup_accept_all_text: e.target.value, + })), + }} + /> +
    + ) : ( + '' + )} +
    + + +
    + {config.popup_action === 'closed' ? ( +
    + + + setConfig((v) => ({ + ...v, + popup_closed_how: e.target.value, + })) + } + /> +
    + ) : ( + '' + )} + {config.popup_type !== 'none' ? ( +
    + + setConfig((v) => ({ + ...v, + popup_mentions_passive_consent: + e.target.checked, + })) + } + /> + +
    + ) : ( + '' + )} + {config.popup_mentions_passive_consent ? ( +
    + + + setConfig((v) => ({ + ...v, + popup_passive_consent_text: e.target.value, + })) + } + /> +
    + ) : ( + '' + )}
    - ) : ( - "" - )} - {config.popup_type === "consent" ? ( -
    - - - setConfig((v) => ({ - ...v, - popup_accept_all_text: e.target.value, - })), - }} - /> -
    - ) : ( - "" - )} -
    - - -
    - {config.popup_action === "closed" ? ( -
    - - - setConfig((v) => ({ ...v, popup_closed_how: e.target.value })) - } - /> -
    - ) : ( - "" - )} - {config.popup_type !== "none" ? ( -
    - - setConfig((v) => ({ - ...v, - popup_mentions_passive_consent: e.target.checked, - })) - } - /> - -
    - ) : ( - "" - )} - {config.popup_mentions_passive_consent ? ( -
    - - - setConfig((v) => ({ - ...v, - popup_passive_consent_text: e.target.value, - })) - } - /> -
    - ) : ( - "" - )} -
    - ); + ); } diff --git a/report-window/email-template-2.tsx b/report-window/email-template-2.tsx index 8209ab5..d071dd7 100644 --- a/report-window/email-template-2.tsx +++ b/report-window/email-template-2.tsx @@ -1,419 +1,488 @@ -import React, { useState } from "react"; -import { RequestCluster } from "../request-cluster"; -import { StolenDataEntry } from "../stolen-data-entry"; -import { getDate, unique } from "../util"; -import DomainSummary from "./domain-summary"; -import EmailTemplate2Controls from "./email-template-2-controls"; +import React, { useState } from 'react'; +import { RequestCluster } from '../request-cluster'; +import { StolenDataEntry } from '../stolen-data-entry'; +import { getDate, unique } from '../util'; +import DomainSummary from './domain-summary'; +import EmailTemplate2Controls from './email-template-2-controls'; export type EmailTemplate2Config = { - popup_type: "none" | "passive_cookie_banner" | "consent"; - popup_action: "ignored" | "accepted" | "closed"; - popup_closed_how: string; - popup_screenshot_base64: string | null; - popup_accept_all_text: string; - popup_mentions_passive_consent: boolean; - popup_passive_consent_text: string; + popup_type: 'none' | 'passive_cookie_banner' | 'consent'; + popup_action: 'ignored' | 'accepted' | 'closed'; + popup_closed_how: string; + popup_screenshot_base64: string | null; + popup_accept_all_text: string; + popup_mentions_passive_consent: boolean; + popup_passive_consent_text: string; }; function ClusterRangeSummary({ cluster }: { cluster: RequestCluster }) { - const range = unique( - cluster.getMarkedEntries().map((entry) => entry.classification) - ); - const has_cookie_ids = cluster - .getMarkedEntries() - .filter((entry) => entry.source === "cookie") - .some((entry) => entry.classification == "id"); - return ( - <> - {[ - "Pańskiego adresu IP", - range.includes("id") - ? "Pańskiego identyfikatora interenetowego" + - (has_cookie_ids ? " z cookie" : "") - : "", - range.includes("history") - ? "części Pańskiej historii przeglądania" - : "", - range.includes("location") ? "informacji na temat Pana położenia" : "", - ] - .filter((e) => e !== "") - .join(", ")} - - ); + const range = unique( + cluster.getMarkedEntries().map((entry) => entry.classification) + ); + const has_cookie_ids = cluster + .getMarkedEntries() + .filter((entry) => entry.source === 'cookie') + .some((entry) => entry.classification == 'id'); + return ( + <> + {[ + range.includes('id') + ? 'Pańskiego identyfikatora internetowego' + + (has_cookie_ids ? ' z cookie' : '') + : '', + range.includes('history') + ? 'części Pańskiej historii przeglądania' + : '', + range.includes('location') + ? 'informacji na temat Pana położenia' + : '', + ] + .filter((e) => e !== '') + .join(', ')} + + ); } function Placeholder({ children }: { children: string }) { - return ( - - - ({children}) - - - ); + return ( + + + ({children}) + + + ); } function Base64Image({ base64 }: { base64: string }) { - return ; + return ; } export default function EmailTemplate2({ - entries, - clusters, + entries, + clusters, }: { - entries: StolenDataEntry[]; - clusters: Record; - version: number; + entries: StolenDataEntry[]; + clusters: Record; + version: number; }): JSX.Element { - const [config, setConfig] = useState({ - popup_type: "none", - popup_action: "ignored", - popup_screenshot_base64: null, - popup_accept_all_text: "Zaakceptuj wszystkie", - popup_mentions_passive_consent: false, - popup_passive_consent_text: "", - popup_closed_how: "kliknięcie przycisku „X”", - }); + const [config, setConfig] = useState({ + popup_type: 'none', + popup_action: 'ignored', + popup_screenshot_base64: null, + popup_accept_all_text: 'Zaakceptuj wszystkie', + popup_mentions_passive_consent: false, + popup_passive_consent_text: '', + popup_closed_how: 'kliknięcie przycisku „X”', + }); - const visited_url = entries[0].request.originalURL; + const visited_url = entries[0].request.originalURL; - return ( - <> - -

    - Dzień dobry, w dniu {getDate()} odwiedziłem stronę {visited_url}. -

    - {config.popup_type === "none" ? ( -

    - Nie ukazał mi się na stronie żaden mechanizm pozyskujący zgodę na - przetwarzanie moich danych osobowych lub umożliwiający mi wyrażenie - sprzeciwu wobec przetwarzania przez stronę moich danych osobowych w - zakresie wyraczającym poza procesy konieczne do wyświetlenia strony -

    - ) : config.popup_type == "passive_cookie_banner" ? ( + return ( <> -

    Na stronie była widoczna informacja o plikach Cookie.

    -

    - -

    + +
    +

    + Dzień dobry, w dniu {getDate()} odwiedziłem stronę{' '} + {visited_url}. +

    + {config.popup_type === 'none' ? ( +

    + Nie ukazał mi się na stronie żaden mechanizm pozyskujący + zgodę na przetwarzanie moich danych osobowych lub + umożliwiający mi wyrażenie sprzeciwu wobec przetwarzania + przez stronę moich danych osobowych w zakresie + wykraczającym poza procesy konieczne do wyświetlenia + strony +

    + ) : config.popup_type == 'passive_cookie_banner' ? ( + <> +

    + Na stronie była widoczna informacja o plikach + Cookie.{' '} +

    +

    + +

    + + ) : ( + <> +

    + Ukazało mi się okienko z informacjami i pytaniami + dotyczącymi sposobów, w jaki strona przetwarza moje + dane osobowe.{' '} +

    +

    + +

    +

    + {config.popup_action === 'ignored' + ? /* HTML */ `Nie kliknąłem żadnego przycisku w + tym okienku. W szczególności nie kliknąłem + przycisku „${config.popup_accept_all_text}”.` + : config.popup_action === 'accepted' + ? `Kliknąłem na widoczną w tym okienku opcję „${config.popup_accept_all_text}”.` + : ''} +

    + + )} +

    + W tym samym czasie rejestrowałem ruch sieciowy generowany + przez tę stronę za pomocą narzędzi w przeglądarce Firefox. + Okazało się, że Państwa strona wysłała była moje dane + osobowe do następujących podmiotów: +

    +
      + {Object.values(clusters) + .filter((cluster) => cluster.hasMarks()) + .map((cluster) => ( + + ))} +
    + {config.popup_action === 'ignored' ? ( +

    + Dane te zostały wysłane, zanim kliknąłem cokolwiek na + tej stronie. +

    + ) : config.popup_action === 'accepted' ? ( +

    + Dane te zostały wysłane po tym, jak kliknąłem przycisk „ + {config.popup_accept_all_text}” +

    + ) : ( + '' + )} +

    + W załączeniu przesyłam część zrzutów ekranu dokumentujących + fakt wysłania tych danych przez Państwa stronę.{' '} +

    +

    Podstawa prawna

    +

    + Ustawa Prawo Telekomunikacyjne w art. 173 reguluje warunki, + które musi spełnić administrator strony, aby jego strona + mogła zapisywać i czytać treść plików cookie. Nie reguluje + jednak tego, jakim podmiotom i w jakim zakresie dane mogą + być ujawniane przez stronę. Tym zajmuje się + Rozporządzenie 2016/679 Parlamentu Europejskiego i Rady (UE) + z dnia 27 kwietnia 2016 r. w sprawie ochrony osób fizycznych + w związku z przetwarzaniem danych osobowych i w sprawie + swobodnego przepływu takich danych oraz uchylenia dyrektywy + 95/46/WE (ogólne rozporządzenie o ochronie danych) – RODO. + Zapis/odczyt plików cookie a ujawnianie ich treści podmiotom + trzecim to dwa różne procesy. Niniejsza wiadomość i pytania + w niej zawarte dotyczą właśnie ujawniania moich + danych osobowych (pochodzących m.in. z Cookies) podmiotom + trzecim. +

    +

    + W kontekście stron internetowych są właściwie dopuszczalne + tylko trzy z sześciu wymienionych w Art. 6 pkt 1 RODO + podstaw prawnych dla przetwarzania danych osobowych: +

    +
      +
    1. + „Zgoda” — osoba, której dane dotyczą wyraziła + zgodę na przetwarzanie swoich danych osobowych w jednym + lub większej liczbie określonych celów ( + Art. 6 pkt 1 lit. a)). +
    2. +
    3. + „Niezbędność” — przetwarzanie jest niezbędne do + wykonania umowy, której stroną jest osoba, której dane + dotyczą, lub do podjęcia działań na żądanie osoby, + której dane dotyczą, przed zawarciem umowy ( + Art. 6 pkt 1 lit. b));{' '} +
    4. +
    5. + „Uzasadniony Interes” — przetwarzanie jest + niezbędne do celów wynikających z prawnie uzasadnionych + interesów realizowanych przez administratora lub przez + stronę trzecią, z wyjątkiem sytuacji, w których + nadrzędny charakter wobec tych interesów mają interesy + lub podstawowe prawa i wolności osoby, której dane + dotyczą, wymagające ochrony danych osobowych, w + szczególności gdy osoba, której dane dotyczą, jest + dzieckiem (Art. 6 pkt 1 lit. f) + ); +
    6. +
    +

    + W przypadku opisywanej przeze mnie mojej wizyty na Państwa + stronie nie ma zastosowania „Zgoda”, gdyż{' '} + {config.popup_action === 'ignored' ? ( + <> + nie wyrażałem żadnej zgody na takie przetwarzanie + moich danych + {config.popup_type === 'consent' ? ( + <> + — w szczególności nie kliknąłem + przycisku „{config.popup_accept_all_text}” + + ) : ( + '' + )} + . + + ) : config.popup_action === 'accepted' ? ( + <> + o ile po wejściu na stronę wcisnąłem w wyskakującym + okienku przycisk „{config.popup_accept_all_text}”, o + tyle nie stanowi to według mnie ważnej w świetle + RODO zgody, gdyż brakowało w tym okienku równie + łatwo osiągalnego przycisku, którego kliknięcie + skutkowałoby zasygnalizowaniem braku mojej zgody na + takie przetwarzanie moich danych. Mówiąc wprost + — wyrażenie „zgody” było łatwiejsze niż jej + niewyrażenie. Niewyrażenie zgody wiąże się z + negatywną konsekwencją konieczności przechodzenia + przez dodatkowe kroki w wyskakującym okienku. Zatem + tak otrzymana przez Państwo moja „zgoda” nie jest + poprawną podstawą prawną do przetwarzania moich + danych osobowych, gdyż nie spełnia warunku + dobrowolności wspomnianego w motywie (42) RODO. + + ) : config.popup_action === 'closed' ? ( + <> + zamknąłem okienko pytające o zgodę poprzez{' '} + {config.popup_closed_how}. Nie może być to uznane za + zgodę, bo nie spełnia to warunku jednoznaczności + opisanego w motywie (32) Rozporządzenia 2016/679.{' '} + + ) : ( + '' + )}{' '} + Za zgodę nie można też uznać posiadania włączonej obsługi + cookies w przeglądarce (gdyż aby zgoda była ważna, musi być + szczegółowa dla każdego celów z osobna), jakichkolwiek + innych ustawień przeglądarki, ani pasywnych działań z mojej + strony (np. „kontynuowanie korzystania ze strony”) + {config.popup_mentions_passive_consent ? ( + <> + {' '} + — nieprawdą więc jest zawarty na Państwa + stronie komunikat „ + {config.popup_passive_consent_text.trim()}” (por. + paragraf 97.{' '} + + oficjalnych wytycznych EROD dotyczących zgody na + mocy rozporządzenia 2016/679 + + ) + + ) : ( + '' + )} + . +

    +

    + W mojej ocenie „Niezbędność“ nie ma zastosowania co do + opisanych powyżej sposobów przetwarzania danych. Nie widzę, + co miałoby sprawiać, aby wysyłanie moich danych osobowych do + wspomnianych powyżej podmiotów trzecich było konieczne do + wyświetlenia Państwa strony na ekranie mojego komputera + (zob.{' '} + + Wytyczne 8/2020 EROD dotyczące targetowania użytkowników + mediów społecznościowych + + , par. 49);.{' '} +

    +

    + Pozostaje zatem „Uzasadniony Interes”. Aby Administrator + mógł używać uzasadnionego interesu jako podstawy prawnej + targetowania użytkowników Sieci, muszą zostać spełnione + m.in. następujące warunki:{' '} +

    +
      +
    1. + Administrator danych lub podmiot trzeci, któremu dane są + ujawniane musi{' '} + + faktycznie realizować dany konkretny uzasadniony + interes + {' '} + ( + + Wyrok TSUE z dnia 29 lipca 2019 r. w sprawie Fashion + ID, C-40/17, ECLI:EU:C:2019:629 + + , pkt 95.) +
    2. +
    3. + Takie przetwarzanie danych jest{' '} + konieczne dla potrzeb wynikających z + danego uzasadnionego interesu ( + + Wyrok TSUE z dnia 29 lipca 2019 r. w sprawie Fashion + ID, C-40/17, ECLI:EU:C:2019:629 + + , pkt 95.) +
    4. +
    5. + Wybrany uzasadniony interes musi mieć pierwszeństwo nad + prawami i wolnościami osoby, której dotyczą przetwarzane + dane ( + + Wyrok TSUE z dnia 29 lipca 2019 r. w sprawie Fashion + ID, C-40/17, ECLI:EU:C:2019:629 + + , pkt 95.) +
    6. +
    7. + Osoby, których dane dotyczą, powinny mieć możliwość + wyrażenia sprzeciwu wobec przetwarzania ich danych do + celów związanych z targetowaniem{' '} + przed rozpoczęciem przetwarzania (zob.{' '} + + Wytyczne 8/2020 EROD dotyczące targetowania + użytkowników mediów społecznościowych + + , par. 54); +
    8. +
    + {config.popup_action !== 'accepted' ? ( +

    + Moje dane zostały ujawnione podmiotom trzecim tuż po + włączeniu strony, zatem nie jest spełniony warunek 4. + Apeluję o wdrożenie zmian na stronie, które sprawią, że + dopiero po świadomym niewyrażeniu sprzeciwu przez + użytkownika aktywowane są procesy przetwarzania danych + osobowych, których podstawą prawną jest uzasadniony + interes. +

    + ) : ( + '' + )} +

    + Jeżeli istnieją jednak inne niż uzasadniony interes ważne + podstawy prawne do takiego przetwarzania moich danych + osobowych przez Państwa stronę, proszę o ich wskazanie,{' '} + dla każdego z wymienionych podmiotów z osobna. + (Przypominam, że Art. 173 ustawy Prawo Telekomunikacyjne nie + ma tutaj zastosowania, ponieważ nie pytam o zapis/odczyt + plików na moim komputerze, tylko o ujawnianie moich danych + osobowych podmiotom trzecim). W przeciwnym wypadku, aby + ustalić, czy moje dane były przez Państwa przetwarzane na + mocy uzasadnionego interesu zgodnie z prawem, proszę o + wypełnienie następującego szablonu (lub udzielenie tych + samych informacji w innej postaci, przy zachowaniu zakresu i + szczegółowości informacji: +

    +
    +

    + W dniu {getDate()} strona {visited_url}: +

    +
      + {Object.values(clusters) + .filter((cluster) => cluster.hasMarks()) + .map((cluster) => ( +
    • + ujawniła pańskie dane w zakresie{' '} + + + {' '} + firmie{' '} + nazwa firmy, + która jest właścicielem domeny{' '} + {cluster.id} i swoją + politykę prywatności publikuje pod adresem{' '} + + adres URL polityki prywatności tej firmy + + . Podstawą prawną takiego przetwarzania + danych przez naszą stronę jest uzasadniony + interes:{' '} + + na czym polega ten uzasadniony interes, + tzn. bieżące działania podejmowane przez + podmiot realizujący ten interes lub + korzyści dla podmiotu realizującego ten + interes oczekiwane w bardzo bliskiej + przyszłości + {' '} + realizowany przez{' '} + + kogo? jaki podmiot podejmuje wspomniane + działania lub jest beneficjentem + wspomnianych korzyści? + + . Ujawnienie{' '} + {' '} + temu podmiotowi przez naszą stronę było + konieczne dla potrzeb wynikających z tego + interesu, ponieważ + + uzasadnienie konieczności + + .
      +
    • + ))} +
    +
    +

    + Proszę w szczególności zwrócić uwagę na podanie adresów do + polityk prywatności tych firm, abym wiedział, jak + skontaktować się z nimi i wnioskować o usunięcie z ich baz + wysłanych przez Państwa stronę moich danych. ) +

    +

    + W odpowiedzi proszę się nie powoływać na IAB Europe i ich + rzekomą renomę w tworzeniu rozwiązań zgodnych z RODO. IAB + chroni interes reklamodawców, a nie Użytkowników, i ich + rozwiązania (np. TCF) są{' '} + + notorycznie niezgodne z RODO i pozbawione szacunku dla + Użytkowników + + . +

    +

    + Apeluję także o wprowadzenie stosownych zmian na stronie + tak, aby nie pozostawiać cienia wątpliwości odnośnie tego, + na mocy jakiej przesłanki legalizującej dane są przetwarzane + przez wspomniane podmioty trzecie, lub tak, aby te dane po + prostu nie były wysyłane. Pomoże to zachować prywatność + innym użytkownikom Państwa strony. Polecam Państwa uwadze + + {' '} + oficjalne wytyczne EROD dotyczące zgody w kontekście + RODO + + . Aby na przykład zapobiec automatycznemu wysyłaniu historii + przeglądania do podmiotów trzecich przez Państwa stronę, + można po prostu ustawić odpowiednio treść nagłówka{' '} + + Referrer-Policy{' '} + + . +

    +
    - ) : ( - <> -

    - Ukazało mi się okienko z informacjami i pytaniami dotyczącymi - sposobów, w jaki strona przetwarza moje dane osobowe.{" "} -

    -

    - -

    -

    - {config.popup_action === "ignored" - ? /* HTML */ `Nie kliknąłem żadnego przycisku w tym okienku. W - szczególności nie kliknąłem przycisku - „${config.popup_accept_all_text}”.` - : config.popup_action === "accepted" - ? `Kliknąlem na widoczną w tym okienku opcję „${config.popup_accept_all_text}”.` - : ""} -

    - - )} -

    - W tym samym czasie rejestrowałem ruch sieciowy generowany przez tę - stronę za pomocą narzędzi w przeglądarce Firefox. Okazało się, że - Państwa strona wysłała była moje dane osobowe do następujących - podmiotów: -

    -
      - {Object.values(clusters) - .filter((cluster) => cluster.hasMarks()) - .map((cluster) => ( - - ))} -
    - {config.popup_action === "ignored" ? ( -

    - Dane te zostały wysłane, zanim kliknąłem cokolwiek na tej stronie. -

    - ) : config.popup_action === "accepted" ? ( -

    - Dane te zostały wysłane po tym, jak kliknąłem przycisk „ - {config.popup_accept_all_text}” -

    - ) : ( - "" - )} -

    - W załączeniu przesyłam część zrzutów ekranu dokumentujących fakt - wysłania tych danych przez Państwa stronę.{" "} -

    -

    Podstawa prawna

    -

    - Ustawa Prawo Telekomunikacyjne w art. 173 reguluje warunki, które musi - spełnić administrator strony, aby jego strona mogła zapisywać i czytać - treść plików cookie. Nie reguluje jednak tego, jakim podmiotom i w jakim - zakresie dane mogą być ujawniane przez stronę. Tym zajmuje się - Rozporządzenie 2016/679 Parlamentu Europejskiego i Rady (UE) z dnia 27 - kwietnia 2016 r. w sprawie ochrony osób fizycznych w związku z - przetwarzaniem danych osobowych i w sprawie swobodnego przepływu takich - danych oraz uchylenia dyrektywy 95/46/WE (ogólne rozporządzenie o - ochronie danych) – RODO. Zapis/odczyt plików cookie a ujawnianie ich - treści podmiotom trzecim to dwa różne procesy. Niniejsza wiadomość i - pytania w niej zawarte dotyczą właśnie ujawniania moich danych - osobowych (pochodzących m.in. z Cookies) podmiotom trzecim. -

    -

    - W kontekście stron internetowych są właściwie dopuszczalne tylko trzy z - sześciu wymienionych w Art. 6 pkt 1 RODO podstaw prawnych dla - przetwarzania danych osobowych: -

    -
      -
    1. - „Zgoda” — osoba, której dane dotyczą wyraziła zgodę na - przetwarzanie swoich danych osobowych w jednym lub większej liczbie - określonych celów (Art. 6 pkt 1 lit. a)). -
    2. -
    3. - „Niezbędność” — przetwarzanie jest niezbędne do wykonania umowy, - której stroną jest osoba, której dane dotyczą, lub do podjęcia działań - na żądanie osoby, której dane dotyczą, przed zawarciem umowy ( - Art. 6 pkt 1 lit. b));{" "} -
    4. -
    5. - „Uzasadniony Interes” — przetwarzanie jest niezbędne do celów - wynikających z prawnie uzasadnionych interesów realizowanych przez - administratora lub przez stronę trzecią, z wyjątkiem sytuacji, w - których nadrzędny charakter wobec tych interesów mają interesy lub - podstawowe prawa i wolności osoby, której dane dotyczą, wymagające - ochrony danych osobowych, w szczególności gdy osoba, której dane - dotyczą, jest dzieckiem (Art. 6 pkt 1 lit. f) - ); -
    6. -
    -

    - W przypadku opisywanej przeze mnie mojej wizyty na Państwa stronie nie - ma zastosowania „Zgoda”, gdyż{" "} - {config.popup_action === "ignored" ? ( - <> - nie wyrażałem żadnej zgody na takie przetwarzanie moich danych - {config.popup_type === "consent" ? ( - <> - — w szczególności nie kliknąłem przycisku „ - {config.popup_accept_all_text}” - - ) : ( - "" - )} - . - - ) : config.popup_action === "accepted" ? ( - <> - o ile po wejściu na stronę wcisnąłem w wyskakującym okienku przycisk - „{config.popup_accept_all_text}”, o tyle nie stanowi to według mnie - ważnej w świetle RODO zgody, gdyż brakowało w tym okienku równie - łatwo osiągalnego przycisku, którego kliknięcie skutkowałoby - zasygnalizowaniem braku mojej zgody na takie przetwarzanie moich - danych. Mówiąc wprost — wyrażenie „zgody” było łatwiejsze niż - jej niewyrażenie. Niewyrażenie zgody wiąże się z negatywną - konsekwencją konieczności przechodzenia przez dodatkowe kroki w - wyskakującym okienku. Zatem tak otrzymana przez Państwo moja „zgoda” - nie jest poprawną podstawą prawną do przetwarzania moich danych - osobowych, gdyż nie spełnia warunku dobrowolności wspomnianego w - motywie (42) RODO. - - ) : config.popup_action === "closed" ? ( - <> - zamknąłem okienko pytające o zgodę poprzez {config.popup_closed_how} - . Nie może być to uznane za zgodę, bo nie spełnia to warunku - jednoznaczności opisanego w motywie (32) Rozporządzenia 2016/679.{" "} - - ) : ( - "" - )}{" "} - Za zgodę nie można też uznać posiadania włączonej obsługi cookies w - przeglądarce (gdyż aby zgoda była ważna, musi być szczegółowa dla - każdego celów z osobna), jakichkolwiek innych ustawień przeglądarki, ani - pasywnych działań z mojej strony (np. „kontynuowanie korzystania ze - strony”) - {config.popup_mentions_passive_consent ? ( - <> - {" "} - — nieprawdą więc jest zawarty na Państwa stronie komunikat „ - {config.popup_passive_consent_text.trim()}” (por. paragraf 97.{" "} - - oficjalnych wytycznych EROD dotyczących zgody na mocy - rozporządzenia 2016/679 - - ) - - ) : ( - "" - )} - . -

    -

    - W mojej ocenie „Niezbędność“ nie ma zastosowania co do opisanych powyżej - sposobów przetwarzania danych. Nie widzę, co miałoby sprawiać, aby - wysyłanie moich danych osobowych do wspomnianych powyżej podmiotów - trzecich było konieczne do wyświetlenia Państwa strony na ekranie mojego - komputera (zob.{" "} - - Wytyczne 8/2020 EROD dotyczące targetowania użytkowników mediów - społecznościowych - - , par. 49);.{" "} -

    -

    - Pozostaje zatem „Uzasadniony Interes”. Aby Administrator mógł używać - uzasadnionego interesu jako podstawy prawnej targetowania użytkowników - Sieci, muszą zostać spełnione m.in. następujące warunki:{" "} -

    -
      -
    1. - Administrator danych lub podmiot trzeci, któremu dane są ujawniane - musi{" "} - - faktycznie realizować dany konkretny uzasadniony interes - {" "} - ( - - Wyrok TSUE z dnia 29 lipca 2019 r. w sprawie Fashion ID, C-40/17, - ECLI:EU:C:2019:629 - - , pkt 95.) -
    2. -
    3. - Takie przetwarzanie danych jest konieczne dla potrzeb - wynikających z danego uzasadnionego interesu ( - - Wyrok TSUE z dnia 29 lipca 2019 r. w sprawie Fashion ID, C-40/17, - ECLI:EU:C:2019:629 - - , pkt 95.) -
    4. -
    5. - Wybrany uzasadniony interes musi mieć pierwszeństwo nad prawami i - wolnościami osoby, której dotyczą przetwarzane dane ( - - Wyrok TSUE z dnia 29 lipca 2019 r. w sprawie Fashion ID, C-40/17, - ECLI:EU:C:2019:629 - - , pkt 95.) -
    6. -
    7. - Osoby, których dane dotyczą, powinny mieć możliwość wyrażenia - sprzeciwu wobec przetwarzania ich danych do celów związanych z - targetowaniem przed rozpoczęciem przetwarzania (zob.{" "} - - Wytyczne 8/2020 EROD dotyczące targetowania użytkowników mediów - społecznościowych - - , par. 54); -
    8. -
    - {config.popup_action !== "accepted" ? ( -

    - Moje dane zostały ujawnione podmiotom trzecim tuż po włączeniu strony, - zatem nie jest spełniony warunek 4. Apeluję o wdrożenie zmian na - stronie, które sprawią, że dopiero po świadomym niewyrażeniu sprzeciwu - przez użytkownika aktywowane są procesy przetwarzania danych - osobowych, których podstawą prawną jest uzasadniony interes. -

    - ) : ( - "" - )} -

    - Jeżeli istnieją jednak inne niż uzasadniony interes ważne podstawy - prawne do takiego przetwarzania moich danych osobowych przez Państwa - stronę, proszę o ich wskazanie,{" "} - dla każdego z wymienionych podmiotów z osobna. (Przypominam, że - Art. 173 ustawy Prawo Telekomunikacyjne nie ma tutaj zastosowania, - ponieważ nie pytam o zapis/odczyt plików na moim komputerze, tylko o - ujawnianie moich danych osobowych podmiotom trzecim). W przeciwnym - wypadku, aby ustalić, czy moje dane były przez Państwa przetwarzane na - mocy uzasadnionego interesu zgodnie z prawem, proszę o wypełnienie - następującego szablonu (lub udzielenie tych samych informacji w innej - postaci, przy zachowaniu zakresu i szczegółowości informacji: -

    -
    -

    - W dniu {getDate()} strona {visited_url}: -

    -
      - {Object.values(clusters) - .filter((cluster) => cluster.hasMarks()) - .map((cluster) => ( -
    • - ujawniła pańskie dane w zakresie{" "} - - - {" "} - firmie nazwa firmy, która jest - właścicielem domeny {cluster.id} i swoją - politykę prywatności publikuje pod adresem{" "} - - adres URL polityki prywatności tej firmy - - . Podstawą prawną takiego przetwarzania danych przez naszą - stronę jest uzasadniony interes:{" "} - - na czym polega ten uzasadniony interes, tzn. bieżące działania - podejmowane przez podmiot realizujący ten interes lub korzyści - dla podmiotu realizującego ten interes oczekiwane w bardzo - bliskiej przyszłości - {" "} - realizowany przez{" "} - - kogo? jaki podmiot podejmuje wspomniane działania lub jest - beneficjentem wspomnianych korzyści? - - . Ujawnienie temu - podmiotowi przez naszą stronę było konieczne dla potrzeb - wynikających z tego interesu, ponieważ - uzasadnienie konieczności.
      -
    • - ))} -
    -
    -

    - Proszę w szczególności zwrócić uwagę na podanie adresów do polityk - prywatności tych firm, abym wiedział, jak skontaktować się z nimi i - wnioskować o usunięcie z ich baz wysłanych przez Państwa stronę moich - danych. ) -

    -

    - W odpowiedzi proszę się nie powoływać na IAB Europe i ich rzekomą renomę - w tworzeniu rozwiązań zgodnych z RODO. IAB chroni interes reklamodawców, - a nie Użytkowników, i ich rozwiązania (np. TCF) są{" "} - - notorycznie niezgodne z RODO i pozbawione szacunku dla Użytkowników - - . -

    -

    - Apeluję także o wprowadzenie stosownych zmian na stronie tak, aby nie - pozostawiać cienia wątpliwości odnośnie tego, na mocy jakiej przesłanki - legalizującej dane są przetwarzane przez wspomniane podmioty trzecie, - lub tak, aby te dane po prostu nie były wysyłane. Pomoże to zachować - prywatność innym użytkownikom Państwa strony. Polecam Państwa uwadze - - {" "} - oficjalne wytyczne EROD dotyczące zgody w kontekście RODO - - . Aby na przykład zapobiec automatycznemu wysyłaniu historii - przeglądania do podmiotów trzecich przez Państwa stronę, można po prostu - ustawić odpowiednio treść nagłówka{" "} - - Referrer-Policy{" "} - - . -

    - - ); + ); } diff --git a/report-window/email-template.tsx b/report-window/email-template.tsx index 0a82151..c2bdca5 100644 --- a/report-window/email-template.tsx +++ b/report-window/email-template.tsx @@ -1,33 +1,33 @@ -import React, { useState } from "react"; -import { RequestCluster } from "../request-cluster"; -import { StolenDataEntry } from "../stolen-data-entry"; -import EmailTemplate1 from "./email-template-1"; -import EmailTemplate2 from "./email-template-2"; +import React, { useState } from 'react'; +import { RequestCluster } from '../request-cluster'; +import { StolenDataEntry } from '../stolen-data-entry'; +import EmailTemplate1 from './email-template-1'; +import EmailTemplate2 from './email-template-2'; export default function EmailTemplate({ - entries, - clusters, - version, + entries, + clusters, + version, }: { - entries: StolenDataEntry[]; - clusters: Record; - version: number; + entries: StolenDataEntry[]; + clusters: Record; + version: number; }) { - const [templateVersion, setTemplateVersion] = useState("2"); - return ( -
    - - {templateVersion === "1" ? ( - - ) : ( - - )} -
    - ); + const [templateVersion, setTemplateVersion] = useState('2'); + return ( +
    + + {templateVersion === '1' ? ( + + ) : ( + + )} +
    + ); } diff --git a/report-window/har-converter.tsx b/report-window/har-converter.tsx index f79e7cb..2829c5c 100644 --- a/report-window/har-converter.tsx +++ b/report-window/har-converter.tsx @@ -1,117 +1,124 @@ -import React, { useEffect, useState } from "react"; -import { HAREntry } from "../extended-request"; -import { StolenDataEntry } from "../stolen-data-entry"; -import { getshorthost, unique } from "../util"; +import React, { useEffect, useState } from 'react'; +import { HAREntry } from '../extended-request'; +import { StolenDataEntry } from '../stolen-data-entry'; +import { getshorthost, unique } from '../util'; function handleNewFile( - element: HTMLInputElement, - entries: StolenDataEntry[], - setFiltered: (Blob) => void + element: HTMLInputElement, + entries: StolenDataEntry[], + setFiltered: (Blob) => void ): void { - const reader = new FileReader(); - reader.addEventListener("load", () => { - const content = JSON.parse(reader.result as string); - content.log.entries = content.log.entries.filter((har_entry: HAREntry) => - entries.some((entry) => entry.matchesHAREntry(har_entry)) - ); - setFiltered( - new Blob([JSON.stringify(content)], { type: "application/json" }) - ); - }); - reader.readAsText(element.files[0]); + const reader = new FileReader(); + reader.addEventListener('load', () => { + const content = JSON.parse(reader.result as string); + content.log.entries = content.log.entries.filter( + (har_entry: HAREntry) => + entries.some((entry) => entry.matchesHAREntry(har_entry)) + ); + setFiltered( + new Blob([JSON.stringify(content)], { type: 'application/json' }) + ); + }); + reader.readAsText(element.files[0]); } function generateFakeHAR(entries: StolenDataEntry[]) { - const requests = unique(entries.map((entry) => entry.request)) - .sort((request1, request2) => { - if (request1.shorthost < request2.shorthost) { - return -1; - } else if (request1.shorthost > request2.shorthost) { - return 1; - } else { - return request2.getBalancedPriority() - request1.getBalancedPriority(); - } - }) - .filter((_, index, array) => { - if (index == 0) return true; - if (array[index].shorthost == array[index - 1].shorthost) { - return false; - } - return true; - }) - .sort( - (entry1, entry2) => - entry2.getBalancedPriority() - entry1.getBalancedPriority() - ); + const requests = unique(entries.map((entry) => entry.request)) + .sort((request1, request2) => { + if (request1.shorthost < request2.shorthost) { + return -1; + } else if (request1.shorthost > request2.shorthost) { + return 1; + } else { + return ( + request2.getBalancedPriority() - + request1.getBalancedPriority() + ); + } + }) + .filter((_, index, array) => { + if (index == 0) return true; + if (array[index].shorthost == array[index - 1].shorthost) { + return false; + } + return true; + }) + .sort( + (entry1, entry2) => + entry2.getBalancedPriority() - entry1.getBalancedPriority() + ); - return { - log: { - version: "1.2", - creator: { - name: "Firefox", - version: "94.0", - }, - browser: { - name: "Firefox", - version: "94.0", - }, - pages: [ - { - startedDateTime: "2021-11-08T20:27:23.195+01:00", - id: "page_1", - title: "HAR DUmp", - pageTimings: { - onContentLoad: 467, - onLoad: 4226, - }, + return { + log: { + version: '1.2', + creator: { + name: 'Firefox', + version: '94.0', + }, + browser: { + name: 'Firefox', + version: '94.0', + }, + pages: [ + { + startedDateTime: '2021-11-08T20:27:23.195+01:00', + id: 'page_1', + title: 'HAR DUmp', + pageTimings: { + onContentLoad: 467, + onLoad: 4226, + }, + }, + ], + entries: requests.map((r) => r.toHAR()), }, - ], - entries: requests.map((r) => r.toHAR()), - }, - }; + }; } export default function HARConverter({ - entries, + entries, }: { - entries: StolenDataEntry[]; + entries: StolenDataEntry[]; }) { - const [filtered, setFiltered] = useState(null); - const [filename, setFilename] = useState(""); - const [fakeHAR, setFakeHAR] = useState>(); - useEffect(() => { - setFakeHAR(generateFakeHAR(entries)); - }, []); + const [filtered, setFiltered] = useState(null); + const [filename, setFilename] = useState(''); + const [fakeHAR, setFakeHAR] = + useState>(); + useEffect(() => { + setFakeHAR(generateFakeHAR(entries)); + }, []); - return ( -
    - { - setFilename(e.target.files[0].name); - handleNewFile(e.target, entries, setFiltered); - }} - /> - {(filtered && ( - - Pobierz wyfiltrowany HAR - - )) || - null} - - Pobierz "zfałszowany" HAR - -
    - ); + return ( +
    + { + setFilename(e.target.files[0].name); + handleNewFile(e.target, entries, setFiltered); + }} + /> + {(filtered && ( + + Pobierz wyfiltrowany HAR + + )) || + null} + + Pobierz "zredukowany" HAR + +
    + ); } diff --git a/report-window/report-window.html b/report-window/report-window.html index 8a59dca..098ce50 100644 --- a/report-window/report-window.html +++ b/report-window/report-window.html @@ -1,16 +1,22 @@ - + + - Wygeneruj maila co zgłoszenia - - -
    + Treść maila do zgłoszenia + + + +
    - - + + + \ No newline at end of file diff --git a/report-window/report-window.tsx b/report-window/report-window.tsx index 7fb19db..0fe6cd7 100644 --- a/report-window/report-window.tsx +++ b/report-window/report-window.tsx @@ -1,123 +1,127 @@ -import React, { useEffect, useState } from "react"; -import ReactDOM from "react-dom"; -import { getMemory } from "../memory"; -import { Classifications, StolenDataEntry } from "../stolen-data-entry"; -import { reduceConcat, useEmitter } from "../util"; -import EmailTemplate from "./email-template"; -import HARConverter from "./har-converter"; +import React, { useEffect, useState } from 'react'; +import ReactDOM from 'react-dom'; +import { getMemory } from '../memory'; +import { Classifications, StolenDataEntry } from '../stolen-data-entry'; +import { reduceConcat, useEmitter } from '../util'; +import EmailTemplate from './email-template'; +import HARConverter from './har-converter'; function DataPreview({ - entries, - refresh, + entries, + refresh, }: { - entries: StolenDataEntry[]; - refresh: () => void; + entries: StolenDataEntry[]; + refresh: () => void; }) { - // currently not used, maybe scraped entirely in the future - return ( - - - - - - - - - - - {entries.map((entry) => ( - - - - +
    Adres docelowyŹródło danychTreść danychKlasyfikacja
    {entry.request.shorthost} - {entry.source}:{entry.name} - - {entry.getValuePreview()} - {/* always gonna have + // currently not used, maybe scraped entirely in the future + return ( + + + + + + + + + + + {entries.map((entry) => ( + + + + - + + ))} - - - - ))} - -
    Adres docelowyŹródło danychTreść danychKlasyfikacja
    {entry.request.shorthost} + {entry.source}:{entry.name} + + {entry.getValuePreview()} + {/* always gonna have one key, because unwrapEntry is called above */} - - + +
    - ); +
    + ); } function Report() { - console.time("getOrigin"); - const origin = new URL(document.location.toString()).searchParams.get( - "origin" - ); - console.timeEnd("getOrigin"); - console.time("useMemory"); - const [counter, setCounter] = useEmitter(getMemory()); - console.timeEnd("useMemory"); - function refresh() { - setCounter((c) => c + 1); - } - console.time("getClustersForOrigin"); - const clusters = getMemory().getClustersForOrigin(origin); - console.timeEnd("getClustersForOrigin"); - const [entries, setEntries] = useState([]); - console.time("useEffect report-window"); - useEffect(() => { - setEntries( - Object.values(clusters) - .map((cluster) => { - cluster.calculatetRepresentativeStolenData(); - return cluster.representativeStolenData; - }) - .reduce(reduceConcat, []) - .filter((entry) => entry.isMarked) + console.time('getOrigin'); + const origin = new URL(document.location.toString()).searchParams.get( + 'origin' ); - }, []); - console.timeEnd("useEffect report-window"); - if (entries.length == 0) { - return <>Wczytywanie...; - } - console.time("rendering template"); - const result = ( -
    - {/*Generuj treść maila dla {origin} - - -
    - ); - console.timeEnd("rendering template"); - return result; + console.timeEnd('getOrigin'); + console.time('useMemory'); + const [counter, setCounter] = useEmitter(getMemory()); + console.timeEnd('useMemory'); + function refresh() { + setCounter((c) => c + 1); + } + console.time('getClustersForOrigin'); + const clusters = getMemory().getClustersForOrigin(origin); + console.timeEnd('getClustersForOrigin'); + const [entries, setEntries] = useState([]); + console.time('useEffect report-window'); + useEffect(() => { + setEntries( + Object.values(clusters) + .map((cluster) => { + cluster.calculateRepresentativeStolenData(); + return cluster.representativeStolenData; + }) + .reduce(reduceConcat, []) + .filter((entry) => entry.isMarked) + ); + }, []); + console.timeEnd('useEffect report-window'); + if (entries.length == 0) { + return <>Wczytywanie...; + } + console.time('rendering template'); + const result = ( +
    + {/*Generuj treść maila dla {origin} + + +
    + ); + console.timeEnd('rendering template'); + return result; } -ReactDOM.render(, document.getElementById("app")); +ReactDOM.render(, document.getElementById('app')); diff --git a/request-cluster.ts b/request-cluster.ts index 95770b1..bd4521c 100644 --- a/request-cluster.ts +++ b/request-cluster.ts @@ -1,173 +1,183 @@ -import { EventEmitter } from "events"; -import ExtendedRequest from "./extended-request"; -import { Sources, StolenDataEntry } from "./stolen-data-entry"; +import { EventEmitter } from 'events'; +import ExtendedRequest from './extended-request'; +import { Sources, StolenDataEntry } from './stolen-data-entry'; -import { allSubhosts, isSameURL, reduceConcat, unique } from "./util"; +import { allSubhosts, isSameURL, reduceConcat, unique } from './util'; const source_priority: Array = [ - "cookie", - "pathname", - "queryparams", - "header", + 'cookie', + 'pathname', + 'queryparams', + 'header', ]; export class RequestCluster extends EventEmitter { - public requests: ExtendedRequest[] = []; - public representativeStolenData: StolenDataEntry[] = []; - constructor(public id: string) { - super(); - } - add(request: ExtendedRequest) { - this.requests.push(request); - this.emit("change"); - } - - hasCookies() { - for (const request of this.requests) { - if (request.hasCookie()) { - return true; - } + public requests: ExtendedRequest[] = []; + public representativeStolenData: StolenDataEntry[] = []; + public expanded: boolean; + constructor(public id: string) { + super(); } - return false; - } - - calculatetRepresentativeStolenData( - filter: { - minValueLength: number; - cookiesOnly: boolean; - cookiesOrOriginOnly: boolean; - } = { minValueLength: 0, cookiesOnly: false, cookiesOrOriginOnly: false } - ): StolenDataEntry[] { - this.representativeStolenData = this.requests - .map((request) => request.stolenData) - - .reduce((a, b) => a.concat(b), []) - .filter((entry) => { - return entry.value.length >= filter.minValueLength; - }) - .filter((entry) => !filter.cookiesOnly || entry.source === "cookie") - .filter( - (entry) => - !filter.cookiesOrOriginOnly || - entry.source === "cookie" || - entry.classification === "history" - ) - .sort((entry1, entry2) => { - if (entry1.value > entry2.value) { - return -1; - } else if (entry1.value < entry2.value) { - return 1; - } else { - const indexA = source_priority.indexOf(entry1.source); - const indexB = source_priority.indexOf(entry2.source); - if (indexA < indexB) { - return -1; - } else if (indexA > indexB) { - return 1; - } else if (entry1.value.length > entry2.value.length) { - return -1; - } else if (entry1.value.length < entry2.value.length) { - return 1; - } else if (entry1.isMarked && !entry2.isMarked) { - return -1; - } else if (!entry1.isMarked && entry2.isMarked) { - return 1; - } else { - return 0; - } - } - }) - .filter((_, index, array) => { - // removing value duplicates - if (index == 0) { - return true; - } - if ( - array[index].getValuePreview() === - array[index - 1].getValuePreview() || - isSameURL(array[index].value, array[index - 1].value) - ) { - return false; - } else { - return true; - } - }) - .sort((entry1, entry2) => { - if (entry1.name < entry2.name) { - return -1; - } else if (entry1.name > entry2.name) { - return 1; - } else { - if (entry1.value.length > entry2.value.length) { - return 1; - } else { - return -1; - } - } - }) - .filter((_, index, array) => { - // removing name duplicates, keeping only the first - which is the longest. Some data loss may occur. - if (index == 0) { - return true; - } - if (array[index].name === array[index - 1].name) { - return false; - } else { - return true; - } - }) - .sort((entry1, entry2) => - entry1.getPriority() > entry2.getPriority() ? -1 : 1 - ); - return this.representativeStolenData; - } - - static sortCompare(a: RequestCluster, b: RequestCluster) { - if (a.hasCookies() == b.hasCookies()) { - if (a.id < b.id) { - return -1; - } else { - return 1; - } - } else { - if (a.hasCookies()) { - return -1; - } else { - return 1; - } + add(request: ExtendedRequest) { + this.requests.push(request); + this.emit('change'); } - } - getMarkedRequests() { - return this.requests.filter((request) => request.hasMark()); - } + toggleExpanded(state: boolean) { + this.expanded = state; + this.emit('change'); + } - getFullHosts() { - return unique( - this.requests - .map((request) => allSubhosts(request.getHost())) - .reduce((a, b) => a.concat(b), []) - ); - } + hasCookies() { + for (const request of this.requests) { + if (request.hasCookie()) { + return true; + } + } + return false; + } - hasMarks() { - return this.requests.some((request) => request.hasMark()); - } + calculateRepresentativeStolenData( + filter: { + minValueLength: number; + cookiesOnly: boolean; + cookiesOrOriginOnly: boolean; + } = { + minValueLength: 0, + cookiesOnly: false, + cookiesOrOriginOnly: false, + } + ): StolenDataEntry[] { + this.representativeStolenData = this.requests + .map((request) => request.stolenData) - getMarkedEntries(): StolenDataEntry[] { - return this.requests - .map((request) => request.getMarkedEntries()) - .reduce(reduceConcat, []); - } + .reduce((a, b) => a.concat(b), []) + .filter((entry) => { + return entry.value.length >= filter.minValueLength; + }) + .filter((entry) => !filter.cookiesOnly || entry.source === 'cookie') + .filter( + (entry) => + !filter.cookiesOrOriginOnly || + entry.source === 'cookie' || + entry.classification === 'history' + ) + .sort((entry1, entry2) => { + if (entry1.value > entry2.value) { + return -1; + } else if (entry1.value < entry2.value) { + return 1; + } else { + const indexA = source_priority.indexOf(entry1.source); + const indexB = source_priority.indexOf(entry2.source); + if (indexA < indexB) { + return -1; + } else if (indexA > indexB) { + return 1; + } else if (entry1.value.length > entry2.value.length) { + return -1; + } else if (entry1.value.length < entry2.value.length) { + return 1; + } else if (entry1.isMarked && !entry2.isMarked) { + return -1; + } else if (!entry1.isMarked && entry2.isMarked) { + return 1; + } else { + return 0; + } + } + }) + .filter((_, index, array) => { + // removing value duplicates + if (index == 0) { + return true; + } + if ( + array[index].getValuePreview() === + array[index - 1].getValuePreview() || + isSameURL(array[index].value, array[index - 1].value) + ) { + return false; + } else { + return true; + } + }) + .sort((entry1, entry2) => { + if (entry1.name < entry2.name) { + return -1; + } else if (entry1.name > entry2.name) { + return 1; + } else { + if (entry1.value.length > entry2.value.length) { + return 1; + } else { + return -1; + } + } + }) + .filter((_, index, array) => { + // removing name duplicates, keeping only the first - which is the longest. Some data loss may occur. + if (index == 0) { + return true; + } + if (array[index].name === array[index - 1].name) { + return false; + } else { + return true; + } + }) + .sort((entry1, entry2) => + entry1.getPriority() > entry2.getPriority() ? -1 : 1 + ); + return this.representativeStolenData; + } - exposesOrigin() { - return this.requests.some((request) => request.exposesOrigin()); - } + static sortCompare(a: RequestCluster, b: RequestCluster) { + if (a.hasCookies() == b.hasCookies()) { + if (a.id < b.id) { + return -1; + } else { + return 1; + } + } else { + if (a.hasCookies()) { + return -1; + } else { + return 1; + } + } + } - autoMark() { - this.calculatetRepresentativeStolenData(); - this.representativeStolenData.forEach((entry) => { - entry.autoMark(); - }); - } + getMarkedRequests() { + return this.requests.filter((request) => request.hasMark()); + } + + getFullHosts() { + return unique( + this.requests + .map((request) => allSubhosts(request.getHost())) + .reduce((a, b) => a.concat(b), []) + ); + } + + hasMarks() { + return this.requests.some((request) => request.hasMark()); + } + + getMarkedEntries(): StolenDataEntry[] { + return this.requests + .map((request) => request.getMarkedEntries()) + .reduce(reduceConcat, []); + } + + exposesOrigin() { + return this.requests.some((request) => request.exposesOrigin()); + } + + autoMark() { + this.calculateRepresentativeStolenData(); + this.representativeStolenData.forEach((entry) => { + entry.autoMark(); + }); + } } diff --git a/sidebar/colors.scss b/sidebar/colors.scss new file mode 100644 index 0000000..d5d7687 --- /dev/null +++ b/sidebar/colors.scss @@ -0,0 +1,7 @@ +$mid-grey: #2e3a59; +$disabled-grey: #8a949f; +$light-grey: #d1d1d1; +$blue: #0048D9; +$icd-yellow: #ffee2c; +$pale-yellow: #fff8e5; +$contrast-yellow: #ffb900; diff --git a/sidebar/fonts.scss b/sidebar/fonts.scss new file mode 100644 index 0000000..360cc80 --- /dev/null +++ b/sidebar/fonts.scss @@ -0,0 +1,49 @@ +@font-face { + font-family: 'Fira Code'; + src: url('./../assets/fonts/fira-code/woff2/FiraCode-Light.woff2') format('woff2'), + url('./../assets/fonts/fira-code/woff/FiraCode-Light.woff') format('woff'); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: 'Fira Code'; + src: url('./../assets/fonts/fira-code/woff2/FiraCode-Regular.woff2') format('woff2'), + url('./../assets/fonts/fira-code/woff/FiraCode-Regular.woff') format('woff'); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: 'Fira Code'; + src: url('./../assets/fonts/fira-code/woff2/FiraCode-Medium.woff2') format('woff2'), + url('./../assets/fonts/fira-code/woff/FiraCode-Medium.woff') format('woff'); + font-weight: 500; + font-style: normal; +} + +@font-face { + font-family: 'Fira Code'; + src: url('./../assets/fonts/fira-code/woff2/FiraCode-SemiBold.woff2') format('woff2'), + url('./../assets/fonts/fira-code/woff/FiraCode-SemiBold.woff') format('woff'); + font-weight: 600; + font-style: normal; +} + +@font-face { + font-family: 'Fira Code'; + src: url('./../assets/fonts/fira-code/woff2/FiraCode-Bold.woff2') format('woff2'), + url('./../assets/fonts/fira-code/woff/FiraCode-Bold.woff') format('woff'); + font-weight: 700; + font-style: normal; +} + +@font-face { + font-family: 'Fira Code VF'; + src: url('./../assets/fonts/fira-code/woff2/FiraCode-VF.woff2') + format('woff2-variations'), + url('./../assets/fonts/fira-code/woff/FiraCode-VF.woff') format('woff-variations'); + /* font-weight requires a range: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide#Using_a_variable_font_font-face_changes */ + font-weight: 300 700; + font-style: normal; +} diff --git a/sidebar/global.scss b/sidebar/global.scss new file mode 100644 index 0000000..3f2fc06 --- /dev/null +++ b/sidebar/global.scss @@ -0,0 +1,54 @@ +@import './fonts.scss'; + +* { + margin: 0px; + padding: 0px; + box-sizing: border-box; + text-rendering: optimizelegibility; + font-smooth: auto; + -webkit-font-smoothing: auto; + user-select: none; +} + +body { + min-width: 24rem; +} + +html { + font-size: 1rem; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, + Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; +} + +button { + display: inline-block; + line-height: 3rem; + padding: 0 1rem; + white-space: nowrap; +} + +select { + height: 3rem; + line-height: 3rem; + flex-shrink: 1; +} + +#tab_dropdown { + flex-basis: 20px; + width: 100px !important; + flex-grow: 1; +} + +#selector { + display: flex; + flex-flow: row nowrap; + align-items: center; +} + +#app { + user-select: text; + padding: 0rem 0.75rem; + display: flex; + flex-flow: column; + justify-content: flex-start; +} diff --git a/sidebar/sidebar.html b/sidebar/sidebar.html index a54937b..7518769 100644 --- a/sidebar/sidebar.html +++ b/sidebar/sidebar.html @@ -1,45 +1,25 @@ - + + - - + + +
    + + - - + + + \ No newline at end of file diff --git a/sidebar/sidebar.scss b/sidebar/sidebar.scss new file mode 100644 index 0000000..b964a62 --- /dev/null +++ b/sidebar/sidebar.scss @@ -0,0 +1,115 @@ +@import './colors.scss'; + +.sidebar { + .header { + display: grid; + grid-template-columns: 6.67rem 1fr 1.25rem; + align-items: center; + max-height: 3.5rem; + min-height: 3.5rem; + border-bottom: 1px solid $light-grey; + position: sticky; + top: 0; + background: #fff; + z-index: 1; + + &--without-logo { + grid-template-columns: 1fr 1.25rem; + } + + .webpage-metadata { + word-break: break-all; + display: flex; + flex-flow: column; + flex-wrap: nowrap; + font-size: 0.875rem; + font-weight: 600; + justify-content: center; + padding-left: 1rem; + color: #000; + + &--without-logo { + padding-left: 0; + } + + &--hyperlink { + font-weight: 400; + color: $mid-grey; + max-height: 2rem; + overflow: hidden; + } + } + + button { + border: none; + background: transparent; + cursor: pointer; + padding: 0; + } + } + + nav { + padding: 0.25rem 0; + border-bottom: 1px solid $light-grey; + + button { + border: none; + cursor: pointer; + color: $mid-grey; + padding: 0.25rem 0rem; + display: flex; + flex-wrap: nowrap; + line-height: 1.25rem; + background: #fff; + width: 100%; + + &:hover { + color: #000; + text-decoration: underline; + svg path { + fill: #000; + } + } + + &:disabled { + cursor: not-allowed; + color: $disabled-grey; + svg path { + fill: $disabled-grey; + } + } + + span { + padding-left: 0.5rem; + font-size: 0.875rem; + font-weight: 500; + } + } + } + + .warning-container { + background-color: $pale-yellow; + border-left: 4px solid $contrast-yellow; + margin-top: 0.5rem; + font-size: 0.875rem; + display: grid; + grid-template-columns: calc(100% - 2rem) 2rem; + align-items: flex-start; + + span { + padding: 1rem; + } + + button { + justify-content: flex-end; + border: none; + cursor: pointer; + color: $mid-grey; + line-height: 1.25rem; + background: transparent; + padding: 0.5rem 0.5rem; + display: flex; + align-self: flex-start; + } + } +} diff --git a/sidebar/sidebar.tsx b/sidebar/sidebar.tsx index ee75be2..8e75107 100644 --- a/sidebar/sidebar.tsx +++ b/sidebar/sidebar.tsx @@ -1,46 +1,81 @@ -import React, { useEffect, useState } from "react"; -import ReactDOM from "react-dom"; -import Options from "../options"; -import { StolenData } from "./stolen-data"; -import { useEmitter } from "../util"; -import { getMemory } from "../memory"; +import React, { Fragment, useEffect, useState } from 'react'; +import ReactDOM from 'react-dom'; +import Options from '../options'; +import { StolenData } from './stolen-data'; +import { getshorthost, useEmitter } from '../util'; +import { getMemory } from '../memory'; +import InfoCircleIcon from '../assets/icons/info_circle_outline.svg'; +import SettingsIcon from '../assets/icons/settings.svg'; +import TrashIcon from '../assets/icons/trash_full.svg'; +import MailIcon from '../assets/icons/mail.svg'; +import ShortLeftIcon from '../assets/icons/short_left.svg'; +import CloseBigIcon from '../assets/icons/close_big.svg'; async function getCurrentTab() { - const [tab] = await browser.tabs.query({ - active: true, - windowId: browser.windows.WINDOW_ID_CURRENT, - }); - return tab; + const [tab] = await browser.tabs.query({ + active: true, + windowId: browser.windows.WINDOW_ID_CURRENT, + }); + return tab; } +import './global.scss'; +import './sidebar.scss'; + const Sidebar = () => { - const [origin, setOrigin] = useState(null); - const [minValueLength, setMinValueLength] = useState(7); - const [cookiesOnly, setCookiesOnly] = useState(false); - const [cookiesOrOriginOnly, setCookiesOrOriginOnly] = useState( - false - ); - const [counter, setCounter] = useEmitter(getMemory()); + const [origin, setOrigin] = useState(null); + const [minValueLength, setMinValueLength] = useState(7); + const [cookiesOnly, setCookiesOnly] = useState(false); + const [stolenDataView, setStolenDataView] = useState(true); + const [cookiesOrOriginOnly, setCookiesOrOriginOnly] = + useState(false); + const [counter, setCounter] = useEmitter(getMemory()); + const [marksOccurrence, setMarksOccurrence] = useState(false); + const [warningDataDialogAck, setWarningDataDialogAck] = useState( + localStorage.getItem('warningDataDialogAck') === null + ? true + : localStorage.getItem('warningDataDialogAck') == 'true' + ? true + : false + ); + const [logoVisibility, setLogoVisibility] = useState( + localStorage.getItem('logoVisibility') === null + ? true + : localStorage.getItem('logoVisibility') == 'true' + ? true + : false + ); - useEffect(() => { - const listener = async (data) => { - console.log("tab change!"); - const tab = await getCurrentTab(); - const url = new URL(tab.url); - if (url.origin.startsWith("moz-extension")) { - return; - } - setOrigin(url.origin); - }; - browser.tabs.onUpdated.addListener(listener); - return () => { - browser.tabs.onUpdated.removeListener(listener); - }; - }); + useEffect(() => { + const listener = async (data: any) => { + console.log('tab change!'); + const tab = await getCurrentTab(); + const url = new URL(tab.url); + if (url.origin.startsWith('moz-extension')) { + return; + } + setOrigin(url.origin); + }; + browser.tabs.onUpdated.addListener(listener); + return () => { + browser.tabs.onUpdated.removeListener(listener); + }; + }); - return ( - <> - {/*
    + useEffect(() => { + for (const cluster of Object.values( + getMemory().getClustersForOrigin(origin) + )) { + if (cluster.hasMarks()) { + return setMarksOccurrence(true); + } + } + return setMarksOccurrence(false); + }, [counter, origin]); + + return ( +
    + {/*
    */} - - setCounter((c) => c + 1)} - minValueLength={minValueLength} - cookiesOnly={cookiesOnly} - cookiesOrOriginOnly={cookiesOrOriginOnly} - /> - - ); +
    + +
    + {origin ? ( + + Analiza strony + + {origin} + + + ) : ( + Przejdź do wybranej strony internetowej + )} +
    + {stolenDataView ? ( + + + + ) : ( + + )} +
    + + {stolenDataView ? ( + + ) : null} + +
    + {stolenDataView ? ( + + {warningDataDialogAck ? ( +
    + + Uwaga! Niekoniecznie każda + przechwycona poniżej informacja jest daną + osobową. Niektóre z podanych domen mogą + należeć do właściciela strony i nie + reprezentować podmiotów trzecich. + + +
    + ) : null} + setCounter((c) => c + 1)} + minValueLength={minValueLength} + cookiesOnly={cookiesOnly} + cookiesOrOriginOnly={cookiesOrOriginOnly} + /> +
    + ) : ( + + )} +
    + + {/*
    Footer marks → {JSON.stringify(marksOccurrence)}
    */} +
    + ); }; -ReactDOM.render(, document.getElementById("app")); +ReactDOM.render(, document.getElementById('app')); diff --git a/sidebar/stolen-data-cluster.scss b/sidebar/stolen-data-cluster.scss new file mode 100644 index 0000000..67cc88d --- /dev/null +++ b/sidebar/stolen-data-cluster.scss @@ -0,0 +1,143 @@ +@import './colors.scss'; + +.stolen-data-cluster-container { + .domains-container { + padding-top: 0.5rem; + display: flex; + flex-flow: column; + border-bottom: none; + + .domain { + color: $mid-grey; + font-size: 0.875rem; + font-weight: 600; + text-decoration: none; + } + + .subdomains-container { + .subdomain { + color: $blue; + font-size: 0.75rem; + font-weight: 600; + text-decoration: none; + } + } + } + + section { + padding-bottom: 0.5rem; + border-bottom: 1px solid $light-grey; + } + + table { + width: 100%; + position: relative; + left: -1px; + text-align: left; + font-size: 0.75rem; + font-family: 'Fira Code'; + border-collapse: separate; + border-spacing: 1px; + + tr { + vertical-align: middle; + line-height: 1rem; + + &:hover { + background-color: $icd-yellow; + color: $mid-grey !important; + cursor: pointer; + } + + &.untoggled { + color: $disabled-grey; + font-weight: 500; + } + + &.toggled { + font-weight: 600; + color: $mid-grey; + + th { + font-weight: 600; + } + } + th { + text-align: left; + text-overflow: ellipsis; + overflow: hidden; + word-wrap: normal; + word-break: normal; + padding-left: 0.25rem; + font-weight: 500; + vertical-align: middle; + width: 10rem; + min-width: 10rem; + max-width: 10rem; + } + } + + .value { + overflow: hidden; + word-break: break-all; + text-overflow: clip; + padding-left: 0.25rem; + } + + .icons { + white-space: nowrap; + padding: 0 0.25rem; + position: relative; + top: 2px; + max-width: 10%; + min-width: 5%; + + .cookie-data { + path { + fill: $mid-grey; + } + } + .request-with-cookie { + path { + fill: $mid-grey; + } + } + .show-history-part { + path { + fill: $mid-grey; + } + } + .request-with-history-part { + path { + fill: $mid-grey; + } + } + } + + .table-header { + color: $mid-grey; + font-size: 0.75rem; + font-weight: 600; + padding: 0.5rem 0; + text-align: left; + cursor: default; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, + Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', + sans-serif; + + &:hover { + background: #fff; + } + } + + .checkbox { + position: relative; + top: 1px; + width: 0.875rem; + + input { + cursor: pointer; + } + } + } +} diff --git a/sidebar/stolen-data-cluster.tsx b/sidebar/stolen-data-cluster.tsx index 615db0b..340002c 100644 --- a/sidebar/stolen-data-cluster.tsx +++ b/sidebar/stolen-data-cluster.tsx @@ -1,154 +1,249 @@ -import React from "react"; -import { getMemory } from "../memory"; -import { StolenDataEntry } from "../stolen-data-entry"; +import React, { Fragment } from 'react'; +import { getMemory } from '../memory'; +import { StolenDataEntry } from '../stolen-data-entry'; -import { maskString, useEmitter } from "../util"; +import { maskString, useEmitter } from '../util'; +import CookieIcon from '../assets/icons/cookie.svg'; +import WarningIcon from '../assets/icons/warning.svg'; + +import './stolen-data-cluster.scss'; const MAX_STRING_VALUE_LENGTH = 100; function StolenDataValue({ - entry, + entry, + refresh, }: { - entry: StolenDataEntry; - prefixKey?: string; + entry: StolenDataEntry; + refresh: Function; + prefixKey?: string; }) { - const [version] = useEmitter(entry); - let body = null; - if (!entry.value) { - body = <>; - } else { - body = ( -
    - {maskString(entry.value, 1, MAX_STRING_VALUE_LENGTH)} -
    + const [version] = useEmitter(entry); + let body = null; + if (!entry.value) { + body = <>; + } else { + body = ( +
    + {maskString(entry.value, 1, MAX_STRING_VALUE_LENGTH)} +
    + ); + } + return ( + { + entry.toggleMark(); + refresh(); + e.stopPropagation(); + }} + title={maskString(entry.value, 1, MAX_STRING_VALUE_LENGTH)} + // style={{ color: entry.isMarked ? 'black' : 'gray' }} + > + {body} + ); - } - return ( -
    { - entry.toggleMark(); - e.stopPropagation(); - }} - style={{ color: entry.isMarked ? "black" : "gray" }} - > - {body} -
    - ); } -function StolenDataRow({ entry }: { entry: StolenDataEntry }) { - const [version] = useEmitter(entry); - return ( - - - entry.toggleMark()} - /> - - entry.toggleMark()} - > - {entry.name} - - - {entry.source === "cookie" ? ( - 🍪 - ) : entry.request.hasCookie() ? ( - - 🍪 - - ) : null} - {entry.exposesOrigin() ? ( - ⚠️ - ) : entry.request.exposesOrigin() ? ( - - ⚠️ - - ) : null} - - - - - - ); +function StolenDataRow({ + entry, + refresh, +}: { + entry: StolenDataEntry; + refresh: Function; +}) { + const [version] = useEmitter(entry); + return ( + + + { + entry.toggleMark(); + refresh(); + }} + /> + + { + entry.toggleMark(); + refresh(); + }} + > + {entry.name} + + + {entry.source === 'cookie' ? ( + + + + ) : entry.request.hasCookie() ? ( + + + + ) : null} + {entry.exposesOrigin() ? ( + + + + ) : entry.request.exposesOrigin() ? ( + + + + ) : null} + + {/* */} + + + + ); } export default function StolenDataCluster({ - origin, - shorthost, - minValueLength, - cookiesOnly, - cookiesOrOriginOnly, + origin, + shorthost, + minValueLength, + refresh, + cookiesOnly, + cookiesOrOriginOnly, }: { - origin: string; - shorthost: string; - refreshToken: number; - minValueLength: number; - cookiesOnly: boolean; - cookiesOrOriginOnly: boolean; + origin: string; + shorthost: string; + refreshToken: number; + minValueLength: number; + refresh: Function; + cookiesOnly: boolean; + cookiesOrOriginOnly: boolean; }) { - const cluster = getMemory().getClustersForOrigin(origin)[shorthost]; - return ( -
    -

    - {cluster.id}{" "} - {cluster.hasCookies() ? "🍪" : ""} x{cluster.requests.length}{" "} - {/* getMemory().removeCookiesFor(origin, shorthost)} - * > - * Wyczyść cookiesy - * */} - { - cluster.autoMark(); - e.preventDefault(); - }} - > - Zaznacz auto - -

    -
    - {cluster.getFullHosts().map((host) => ( - - {host},{" "} - - ))} -
    - - - {cluster - .calculatetRepresentativeStolenData({ - minValueLength, - cookiesOnly, - cookiesOrOriginOnly, - }) - .map((entry) => ( - - ))} - -
    -
    - ); + const cluster = getMemory().getClustersForOrigin(origin)[shorthost]; + const fullHosts = cluster.getFullHosts(); + + return ( +
    +
    + + {cluster.id} + + +
    +
    + + + + + + + + {cluster + .calculateRepresentativeStolenData({ + minValueLength, + cookiesOnly, + cookiesOrOriginOnly, + }) + .map((entry) => ( + + ))} + +
    + Znalezione ustawienia: +
    +
    +
    + + //
    + //

    + // {cluster.id}{' '} + // {cluster.hasCookies() ? '🍪' : ''} x{cluster.requests.length}{' '} + // {/* getMemory().removeCookiesFor(origin, shorthost)} + // * > + // * Wyczyść cookiesy + // * */} + // { + // cluster.autoMark(); + // refresh(); + // e.preventDefault(); + // }} + // > + // Zaznacz auto + // + //

    + //
    + // {cluster.getFullHosts().map((host) => ( + // + // {host},{' '} + // + // ))} + //
    + // + // + // {cluster + // .calculateRepresentativeStolenData({ + // minValueLength, + // cookiesOnly, + // cookiesOrOriginOnly, + // }) + // .map((entry) => ( + // + // ))} + // + //
    + //
    + ); } diff --git a/sidebar/stolen-data.scss b/sidebar/stolen-data.scss new file mode 100644 index 0000000..3e01021 --- /dev/null +++ b/sidebar/stolen-data.scss @@ -0,0 +1,10 @@ +@import './colors.scss'; + +.stolen-data-container { + padding-top: .5rem; + span { + color: $mid-grey; + font-size: 0.75rem; + font-weight: 600; + } +} \ No newline at end of file diff --git a/sidebar/stolen-data.tsx b/sidebar/stolen-data.tsx index 58c5048..c39a4f1 100644 --- a/sidebar/stolen-data.tsx +++ b/sidebar/stolen-data.tsx @@ -1,93 +1,104 @@ -import React from "react"; -import { RequestCluster } from "../request-cluster"; +import React from 'react'; +import { RequestCluster } from '../request-cluster'; -import StolenDataCluster from "./stolen-data-cluster"; -import { getshorthost } from "../util"; -import { getMemory } from "../memory"; +import StolenDataCluster from './stolen-data-cluster'; +import { getshorthost } from '../util'; +import { getMemory } from '../memory'; + +import './stolen-data.scss'; export function StolenData({ - origin, - minValueLength, - refreshToken, - refresh, - cookiesOnly, - cookiesOrOriginOnly, + origin, + minValueLength, + refreshToken, + refresh, + cookiesOnly, + cookiesOrOriginOnly, }: { - origin: string; - refreshToken: number; - refresh: () => void; - minValueLength: number; - cookiesOnly: boolean; - cookiesOrOriginOnly: boolean; + origin: string; + refreshToken: number; + refresh: () => void; + minValueLength: number; + cookiesOnly: boolean; + cookiesOrOriginOnly: boolean; }) { - if (!origin) { - return
    ; - } - const clusters = Object.values(getMemory().getClustersForOrigin(origin)) - .sort(RequestCluster.sortCompare) - .filter((cluster) => !cookiesOnly || cluster.hasCookies()) - .filter( - (cluster) => - !cookiesOrOriginOnly || cluster.hasCookies() || cluster.exposesOrigin() + if (!origin) { + return ( +
    + Otwórz nową kartę z wybraną stroną internetową +
    + ); + } + const clusters = Object.values(getMemory().getClustersForOrigin(origin)) + .sort(RequestCluster.sortCompare) + .filter((cluster) => !cookiesOnly || cluster.hasCookies()) + .filter( + (cluster) => + !cookiesOrOriginOnly || + cluster.hasCookies() || + cluster.exposesOrigin() + ); + return ( +
    + {/* + */} + + {/* */} + + {/* */} + + Domeny oraz przesłane informacje + + {clusters.map((cluster) => { + return ( + + ); + })} +
    ); - return ( -
    - {" "} -
    -

    - {origin} - - - - -

    - {clusters.map((cluster) => { - return ( - - ); - })} -
    -
    - ); } diff --git a/sidebar/tab-dropdown.tsx b/sidebar/tab-dropdown.tsx index 843e5fd..4811a0f 100644 --- a/sidebar/tab-dropdown.tsx +++ b/sidebar/tab-dropdown.tsx @@ -1,30 +1,30 @@ -import React from "react"; -import { useEffect, useState } from "react"; +import React from 'react'; +import { useEffect, useState } from 'react'; export default function TabDropdown({ - setPickedTab, - pickedTab, + setPickedTab, + pickedTab, }: { - setPickedTab: (tab_id: number) => void; - pickedTab: number; + setPickedTab: (tab_id: number) => void; + pickedTab: number; }) { - const [tabs, setTabs] = useState([]); - useEffect(() => { - browser.tabs.query({ currentWindow: true }).then(setTabs); - }, []); - return ( - - ); + const [tabs, setTabs] = useState([]); + useEffect(() => { + browser.tabs.query({ currentWindow: true }).then(setTabs); + }, []); + return ( + + ); } diff --git a/util.ts b/util.ts index b8cdd27..de7c283 100644 --- a/util.ts +++ b/util.ts @@ -42,7 +42,7 @@ export function getshorthost(host: string) { .replace(/^.*:\/\//, "") .replace(/\/.*$/, "") .split("."); - let lookback = parts.at(-2).length > 3 ? -2 : -3; + let lookback = !['co','com'].includes(parts.at(-2)) ? -2 : -3; if (parts.at(-2) == "doubleclick" || parts.at(-2) == "google") { lookback = -4; // to distinguish between google ads and stats } else if (parts.at(-2) == "google") {