diff --git a/.browserslistrc b/.browserslistrc
deleted file mode 100644
index 9defcdad..00000000
--- a/.browserslistrc
+++ /dev/null
@@ -1 +0,0 @@
-last 2 year, firefox esr
diff --git a/.editorconfig b/.editorconfig
index d18cc919..7907cdff 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -6,7 +6,6 @@ root = true
[*]
indent_style = tab
-indent_size = 4
end_of_line = lf
charset = utf-8
@@ -16,6 +15,10 @@ insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
-[*.{json,md,yml}]
+[*.{json,yml}]
+indent_style = space
+indent_size = 2
+
+[.eslintrc]
indent_style = space
indent_size = 2
diff --git a/.eslintignore b/.eslintignore
index 219bb10b..512bdec8 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,3 +1,9 @@
-public/
+# built by tools
+client/js/libs.min.js
+client/js/lounge.templates.js
+
+# third party
+client/js/libs/jquery/*.js
+client/js/libs/*.js
+
coverage/
-dist/
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
deleted file mode 100644
index 11d3112e..00000000
--- a/.eslintrc.cjs
+++ /dev/null
@@ -1,193 +0,0 @@
-// @ts-check
-const {defineConfig} = require("eslint-define-config");
-
-const projects = defineConfig({
- parserOptions: {
- project: [
- "./tsconfig.json",
- "./client/tsconfig.json",
- "./server/tsconfig.json",
- "./shared/tsconfig.json",
- "./test/tsconfig.json",
- ],
- },
-}).parserOptions.project;
-
-const baseRules = defineConfig({
- rules: {
- "block-scoped-var": "error",
- curly: ["error", "all"],
- "dot-notation": "error",
- eqeqeq: "error",
- "handle-callback-err": "error",
- "no-alert": "error",
- "no-catch-shadow": "error",
- "no-control-regex": "off",
- "no-console": "error",
- "no-duplicate-imports": "error",
- "no-else-return": "error",
- "no-implicit-globals": "error",
- "no-restricted-globals": ["error", "event", "fdescribe"],
- "no-template-curly-in-string": "error",
- "no-unsafe-negation": "error",
- "no-useless-computed-key": "error",
- "no-useless-constructor": "error",
- "no-useless-return": "error",
- "no-use-before-define": [
- "error",
- {
- functions: false,
- },
- ],
- "no-var": "error",
- "object-shorthand": [
- "error",
- "methods",
- {
- avoidExplicitReturnArrows: true,
- },
- ],
- "padding-line-between-statements": [
- "error",
- {
- blankLine: "always",
- prev: ["block", "block-like"],
- next: "*",
- },
- {
- blankLine: "always",
- prev: "*",
- next: ["block", "block-like"],
- },
- ],
- "prefer-const": "error",
- "prefer-rest-params": "error",
- "prefer-spread": "error",
- "spaced-comment": ["error", "always"],
- strict: "off",
- yoda: "error",
- },
-}).rules;
-
-const vueRules = defineConfig({
- rules: {
- "import/no-default-export": 0,
- "import/unambiguous": 0, // vue SFC can miss script tags
- "@typescript-eslint/prefer-readonly": 0, // can be used in template
- "vue/component-tags-order": [
- "error",
- {
- order: ["template", "style", "script"],
- },
- ],
- "vue/multi-word-component-names": "off",
- "vue/no-mutating-props": "off",
- "vue/no-v-html": "off",
- "vue/require-default-prop": "off",
- "vue/v-slot-style": ["error", "longform"],
- },
-}).rules;
-
-const tsRules = defineConfig({
- rules: {
- // note you must disable the base rule as it can report incorrect errors
- "no-shadow": "off",
- "@typescript-eslint/no-shadow": ["error"],
- "@typescript-eslint/no-redundant-type-constituents": "off",
- },
-}).rules;
-
-const tsRulesTemp = defineConfig({
- rules: {
- // TODO: eventually remove these
- "@typescript-eslint/ban-ts-comment": "off",
- "@typescript-eslint/no-explicit-any": "off",
- "@typescript-eslint/no-non-null-assertion": "off",
- "@typescript-eslint/no-this-alias": "off",
- "@typescript-eslint/no-unnecessary-type-assertion": "off",
- "@typescript-eslint/no-unsafe-argument": "off",
- "@typescript-eslint/no-unsafe-assignment": "off",
- "@typescript-eslint/no-unsafe-call": "off",
- "@typescript-eslint/no-unsafe-member-access": "off",
- "@typescript-eslint/no-unused-vars": "off",
- },
-}).rules;
-
-const tsTestRulesTemp = defineConfig({
- rules: {
- // TODO: remove these
- "@typescript-eslint/no-unsafe-return": "off",
- "@typescript-eslint/no-empty-function": "off",
- "@typescript-eslint/restrict-plus-operands": "off",
- },
-}).rules;
-
-module.exports = defineConfig({
- root: true,
- parserOptions: {
- ecmaVersion: 2022,
- },
- overrides: [
- {
- files: ["**/*.ts", "**/*.vue"],
- parser: "@typescript-eslint/parser",
- parserOptions: {
- tsconfigRootDir: __dirname,
- project: projects,
- extraFileExtensions: [".vue"],
- },
- plugins: ["@typescript-eslint"],
- extends: [
- "eslint:recommended",
- "plugin:@typescript-eslint/recommended",
- "plugin:@typescript-eslint/recommended-requiring-type-checking",
- "prettier",
- ],
- rules: {
- ...baseRules,
- ...tsRules,
- ...tsRulesTemp,
- },
- },
- {
- files: ["**/*.vue"],
- parser: "vue-eslint-parser",
- parserOptions: {
- ecmaVersion: 2022,
- ecmaFeatures: {
- jsx: true,
- },
- parser: "@typescript-eslint/parser",
- tsconfigRootDir: __dirname,
- project: projects,
- },
- plugins: ["vue"],
- extends: [
- "eslint:recommended",
- "plugin:vue/vue3-recommended",
- "plugin:@typescript-eslint/recommended",
- "plugin:@typescript-eslint/recommended-requiring-type-checking",
- "prettier",
- ],
- rules: {...baseRules, ...tsRules, ...tsRulesTemp, ...vueRules},
- },
- {
- files: ["./tests/**/*.ts"],
- parser: "@typescript-eslint/parser",
- rules: {
- ...baseRules,
- ...tsRules,
- ...tsRulesTemp,
- ...tsTestRulesTemp,
- },
- },
- ],
- env: {
- es6: true,
- browser: true,
- mocha: true,
- node: true,
- },
- extends: ["eslint:recommended", "prettier"],
- rules: baseRules,
-});
diff --git a/.eslintrc.yml b/.eslintrc.yml
new file mode 100644
index 00000000..971713e2
--- /dev/null
+++ b/.eslintrc.yml
@@ -0,0 +1,43 @@
+---
+
+root: true
+
+env:
+ browser: true
+ mocha: true
+ node: true
+
+rules:
+ block-spacing: [2, always]
+ brace-style: [2, 1tbs]
+ comma-dangle: 0
+ curly: [2, all]
+ eqeqeq: 2
+ indent: [2, tab]
+ key-spacing: [2, {beforeColon: false, afterColon: true}]
+ keyword-spacing: [2, {before: true, after: true}]
+ linebreak-style: [2, unix]
+ no-console: 0
+ no-control-regex: 0
+ no-inner-declarations: 2
+ no-invalid-regexp: 2
+ no-irregular-whitespace: 2
+ no-trailing-spaces: 2
+ no-unexpected-multiline: 2
+ no-unreachable: 2
+ object-curly-spacing: [2, never]
+ quotes: [2, double, avoid-escape]
+ semi: [2, always]
+ space-before-blocks: 2
+ space-infix-ops: 2
+ spaced-comment: [2, always]
+
+globals:
+ log: false
+ $: false
+ Favico: false
+ Handlebars: false
+ io: false
+ Mousetrap: false
+
+extends: eslint:recommended
diff --git a/.github/ISSUE_TEMPLATE/Bug_Report.md b/.github/ISSUE_TEMPLATE/Bug_Report.md
deleted file mode 100644
index 22efc625..00000000
--- a/.github/ISSUE_TEMPLATE/Bug_Report.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-name: Bug Report
-about: Create a bug report
-labels: "Type: Bug"
----
-
-
-
-- _Node version:_
-- _Browser version:_
-- _Device, operating system:_
-- _The Lounge version:_
-
----
diff --git a/.github/ISSUE_TEMPLATE/Feature_Request.md b/.github/ISSUE_TEMPLATE/Feature_Request.md
deleted file mode 100644
index a0ea13c3..00000000
--- a/.github/ISSUE_TEMPLATE/Feature_Request.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-name: Feature Request
-about: Request a new feature
-labels: "Type: Feature"
----
-
-
-
-
-### Feature Description
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
deleted file mode 100644
index a06afb86..00000000
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-contact_links:
- - name: Docker container issues
- url: https://github.com/thelounge/thelounge-docker/issues
- about: Report issues related to the Docker container here
-
- - name: Debian package issues
- url: https://github.com/thelounge/thelounge-deb/issues
- about: Report issues related to the Debian package here
-
- - name: Arch Linux package issues
- url: https://github.com/thelounge/thelounge-archlinux/issues
- about: Report issues related to the Arch Linux package here
-
- - name: General support
- url: https://demo.thelounge.chat/?join=%23thelounge
- about: "Join #thelounge on Libera.Chat to ask a question before creating an issue"
diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md
deleted file mode 100644
index 62c3148e..00000000
--- a/.github/SUPPORT.md
+++ /dev/null
@@ -1,11 +0,0 @@
-## Support
-
-Welcome to The Lounge, it's great to have you here! If you have a question, or
-need help, you have a few options:
-
-- Check out [existing questions on Stack Overflow](https://stackoverflow.com/questions/tagged/thelounge)
- to see if yours has been answered before. If not, feel free to [ask for a new question](https://stackoverflow.com/questions/ask?tags=thelounge)
- (using `thelounge` tag so that other people can easily find it).
-- Find us on the Libera.Chat channel `#thelounge`. You might not get an answer
- right away, but this channel is full of nice people who will be happy to
- help you.
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
deleted file mode 100644
index c2d7665b..00000000
--- a/.github/workflows/build.yml
+++ /dev/null
@@ -1,48 +0,0 @@
-name: Build
-
-permissions:
- contents: read
-
-on: [push, pull_request]
-
-jobs:
- build:
- name: Node ${{ matrix.node_version }} on ${{ matrix.os }}
-
- strategy:
- matrix:
- include:
- # EOL: April 2025
- - os: macOS-latest
- node_version: 18.x
- - os: windows-latest
- node_version: 18.x
- - os: ubuntu-latest
- node_version: 18.x
- # EOL: April 2026
- - os: ubuntu-latest
- node_version: 20.x
- # EOL: April June 2024
- - os: ubuntu-latest
- node_version: 21.x
-
- runs-on: ${{ matrix.os }}
-
- steps:
- - uses: actions/checkout@master
-
- - name: Setup Node.js
- uses: actions/setup-node@v4
- with:
- node-version: ${{ matrix.node_version }}
-
- - name: Install
- run: yarn --frozen-lockfile --non-interactive
-
- - name: Build
- run: yarn build
- env:
- NODE_ENV: production
-
- - name: Test
- run: yarn test
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
deleted file mode 100644
index 370178fe..00000000
--- a/.github/workflows/release.yml
+++ /dev/null
@@ -1,53 +0,0 @@
-name: Release
-
-permissions:
- contents: read
- id-token: write
-
-on:
- push:
- tags: v*
-
-jobs:
- release:
- name: Release workflow
-
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@master
-
- - name: Setup Node.js
- uses: actions/setup-node@v4
- with:
- node-version: "latest"
- registry-url: "https://registry.npmjs.org/"
-
- - name: Install
- run: yarn --frozen-lockfile --non-interactive
-
- - name: Build
- run: yarn build
- env:
- NODE_ENV: production
-
- - name: Test
- run: yarn test
-
- - name: Publish latest
- if: "!contains(github.ref, '-')"
- run: npm publish --tag latest --provenance
- env:
- NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
-
- - name: Publish next
- if: contains(github.ref, '-')
- run: npm publish --tag next --provenance
- env:
- NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
-
- - name: Remove next tag
- if: "!contains(github.ref, '-')"
- run: npm dist-tag rm thelounge next || true
- env:
- NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 2f36fb37..082fcf7b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,11 @@
node_modules/
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-package-lock.json
+npm-debug.log
coverage/
-public/
-dist/
+
+# Built assets created at npm install/prepublish time
+# See https://docs.npmjs.com/misc/scripts
+client/fonts/
+client/js/libs.min.js.map
+client/js/libs.min.js
+client/js/lounge.templates.js
diff --git a/.istanbul.yml b/.istanbul.yml
new file mode 100644
index 00000000..e6e79229
--- /dev/null
+++ b/.istanbul.yml
@@ -0,0 +1,8 @@
+instrumentation:
+ include-all-sources: true
+ excludes:
+ - Gruntfile.js
+ - client/js/libs/*.js
+ - client/js/libs/jquery/*.js
+ - client/js/libs.min.js
+ - client/js/lounge.js
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 00000000..6115c65f
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,19 @@
+# This file must not contain generated assets listed in .gitignore.
+# npm-debug.log and node_modules/ are ignored by default.
+# See https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package
+
+client/views/
+coverage/
+scripts/
+test/
+.editorconfig
+.eslintignore
+.eslintrc.yml
+.gitattributes
+.gitignore
+.istanbul.yml
+.npmignore
+.stylelintrc
+.travis.yml
+appveyor.yml
+Gruntfile.js
diff --git a/.npmrc b/.npmrc
deleted file mode 100644
index 8863826c..00000000
--- a/.npmrc
+++ /dev/null
@@ -1,2 +0,0 @@
-save-exact = true
-sign-git-tag = true
diff --git a/.prettierignore b/.prettierignore
deleted file mode 100644
index 5dabdfae..00000000
--- a/.prettierignore
+++ /dev/null
@@ -1,28 +0,0 @@
-coverage/
-public/
-dist/
-test/fixtures/.thelounge/logs/
-test/fixtures/.thelounge/certificates/
-test/fixtures/.thelounge/storage/
-test/fixtures/.thelounge/sts-policies.json
-*.log
-*.png
-*.svg
-*.ico
-*.wav
-*.tpl
-*.sh
-*.opts
-*.txt
-yarn.lock
-.gitignore
-.npmrc
-.npmignore
-.prettierignore
-.thelounge_home
-.editorconfig
-.eslintignore
-.gitattributes
-.browserslistrc
-
-*.css
diff --git a/.stylelintrc b/.stylelintrc
new file mode 100644
index 00000000..d346c411
--- /dev/null
+++ b/.stylelintrc
@@ -0,0 +1,74 @@
+{
+ "ignoreFiles": [
+ "client/css/bootstrap.css",
+ "coverage/**/*.css"
+ ],
+ "rules": {
+ "at-rule-empty-line-before": ["always", {
+ "except": ["blockless-group", "first-nested"],
+ "ignore": ["after-comment"]
+ }],
+ "block-closing-brace-newline-after": "always",
+ "block-closing-brace-newline-before": "always-multi-line",
+ "block-closing-brace-space-before": "always-single-line",
+ "block-no-empty": true,
+ "block-opening-brace-newline-after": "always-multi-line",
+ "block-opening-brace-space-after": "always-single-line",
+ "block-opening-brace-space-before": "always",
+ "color-hex-case": "lower",
+ "color-hex-length": "short",
+ "color-no-invalid-hex": true,
+ "comment-empty-line-before": ["always", {
+ "except": ["first-nested"],
+ "ignore": ["stylelint-commands"]
+ }],
+ "comment-whitespace-inside": "always",
+ "declaration-bang-space-after": "never",
+ "declaration-bang-space-before": "always",
+ "declaration-block-semicolon-newline-after": "always-multi-line",
+ "declaration-block-semicolon-space-after": "always-single-line",
+ "declaration-block-semicolon-space-before": "never",
+ "declaration-block-single-line-max-declarations": 1,
+ "declaration-colon-newline-after": "always-multi-line",
+ "declaration-colon-space-after": "always-single-line",
+ "declaration-colon-space-before": "never",
+ "function-calc-no-unspaced-operator": true,
+ "function-comma-newline-after": "always-multi-line",
+ "function-comma-space-after": "always-single-line",
+ "function-comma-space-before": "never",
+ "function-parentheses-newline-inside": "always-multi-line",
+ "function-parentheses-space-inside": "never-single-line",
+ "function-whitespace-after": "always",
+ "function-url-quotes": "always",
+ "indentation": "tab",
+ "max-empty-lines": 1,
+ "media-feature-colon-space-after": "always",
+ "media-feature-colon-space-before": "never",
+ "media-feature-range-operator-space-after": "always",
+ "media-feature-range-operator-space-before": "always",
+ "media-query-list-comma-newline-after": "always-multi-line",
+ "media-query-list-comma-space-after": "always-single-line",
+ "media-query-list-comma-space-before": "never",
+ "media-query-parentheses-space-inside": "never",
+ "no-eol-whitespace": true,
+ "no-missing-eof-newline": true,
+ "number-leading-zero": "never",
+ "number-no-trailing-zeros": true,
+ "length-zero-no-unit": true,
+ "declaration-block-no-duplicate-properties": true,
+ "declaration-block-no-shorthand-property-overrides": true,
+ "rule-non-nested-empty-line-before": ["always-multi-line", {
+ "ignore": ["after-comment"]
+ }],
+ "declaration-block-trailing-semicolon": "always",
+ "selector-combinator-space-after": "always",
+ "selector-combinator-space-before": "always",
+ "selector-list-comma-newline-after": "always",
+ "selector-list-comma-space-before": "never",
+ "selector-pseudo-element-colon-notation": "single",
+ "string-quotes": "double",
+ "value-list-comma-newline-after": "always-multi-line",
+ "value-list-comma-space-after": "always-single-line",
+ "value-list-comma-space-before": "never"
+ }
+}
diff --git a/.thelounge_home b/.thelounge_home
deleted file mode 100644
index 88044472..00000000
--- a/.thelounge_home
+++ /dev/null
@@ -1 +0,0 @@
-~/.thelounge
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000..6c8bce0f
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,30 @@
+language: node_js
+node_js:
+- 6
+- 4
+
+matrix:
+ fast_finish: true
+ include:
+ - os: osx
+ node_js: 4
+
+cache:
+ directories:
+ - node_modules
+
+notifications:
+ email:
+ on_success: never
+ on_failure: always
+
+deploy:
+ provider: npm
+ email:
+ secure: Eb/dO3VEnuG5CFSJbiTBDZ4X29o1bTITqfzc4SZJqkSKHLZ5/l0VHyd1In7T2U9yBtysnmm+dsOWYFwnH5NMt5kvGkkX754HBDz0QXO//IqADA/1cH1MMXuzJjRvHNrtbq3c6Iv0vO827kXfvqwkfGTmXfreT5w+xF7Y+0SjF8pfu2d/Z5omrmoy9J9SF/kfmahKYZwakc3h8p29JPmnFMUAR0JiZS/2gLSHQnGA3mCcnlO+U3bQuTVW3Z9RhiG51f/EMFfNZ8pBttM6CgE2Zth3AT50jbKjRgYdYN2ee/Z3qUJIoA6dfPALC7B+Z2UekqTiKx4SCk+9vZJJXqT8J+Fe67Dki/FgNWnEZaTn8eFs+Gfh2nnokNZUMd/2mMT0y0KbRaOYQarn6lFw+/Cn9hD6e8uRCqY0+YspMvGtV3LuHFy+br6YphlG6YKxJzExtGDvrwlDD70xJtqcgnlET3XOdzvfCpRSskh7FmVJMoL39f/j9r4FzWVDmfnRnDT6Cac2dSdbQM0Ldw3+65l/57K/Km7NeHbLA3LsnjSJqXuysYwosd6iUOQen59Dy+TvwKafEfAGXWcZNguFURIMf2LRZ4rwTZl6pp30nj23U6rmkWm3JTRZC95i/O4yP2rVoljNUEuMlHVts63r3lwXtuGQVo3+lQCYErK4Ceo7cQc=
+ api_key:
+ secure: I9iN31GWI+Mz0xPw81N7qh1M6uidB+3BmiPUXt8QigX45zwp9EhvfZ0U/AIdUyQwzK2RK1zLRQSt+2/1jyeVi+U+AAsRRmaAUx8iqKaQPAkPnQtElolgRP04WSgo7fvNejfM7zS939bQNKG3RlSm04yPgu+ke2igf799p2bpFe2LtyoEeIiUfrUkBiMSpMguN9XF8a7jqCyIouTKjXHR24RmzJ9r7ZoMV27yQauS7XlD81bontzNRZxTytDKdJpZ+sxGIT9mbbtM4LUFX8MeNe3p/bjWavEhrO0ZIpkbOfS/L/w1375YDoNPXxCs288lnGUH+NbGNAEfn+BTz8cmUp7jI7QWR/kNACPeopdAX4OdZxT8wfQcfQZrfCuSpKciOMC7vGgPpQqjQ61t1RKcKs9VUnwC0SwWjyo8LlzkFKnP1ks0eDGYsSoPLdpC9+76UmePkQdxMhscO8TOgkOCcsTMLiyt6ABGOGKu2iE5SsjUYtPiSiRzSBAQENoO560+xBSVTKwqvvhzUAIt4AuAQSgsFjAylDdyzKoObHX12hBdALrqSOOSVwwIQ5/jTgNAsilURHo7KPD407PhRnLOsvumL0qg4sr9S1hjuUKnNla5dg9GY8FVjJ+b2t0A2vgfG1pR1e3vrJRXrpkfRorhmjvKAk2o5you5pQ1Itty7rM=
+ on:
+ node: '4'
+ tags: true
+ repo: thelounge/lounge
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
deleted file mode 100644
index 6e4bf808..00000000
--- a/.vscode/extensions.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "recommendations": [
- "EditorConfig.EditorConfig",
- "esbenp.prettier-vscode",
- "dbaeumer.vscode-eslint",
- "Vue.volar",
- "Vue.vscode-typescript-vue-plugin"
- ],
- "unwantedRecommendations": []
-}
diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index cb73945b..00000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "configurations": [
- {
- "type": "node-terminal",
- "name": "Run Dev",
- "request": "launch",
- "command": "yarn dev",
- "cwd": "${workspaceFolder}"
- }
- ]
-}
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index a7e07398..00000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "editor.formatOnSave": true,
- "prettier.useEditorConfig": true,
- "prettier.requireConfig": true,
- "prettier.disableLanguages": [],
- "eslint.packageManager": "yarn",
- "eslint.codeActionsOnSave.mode": "all",
- "[typescript]": {"editor.defaultFormatter": "esbenp.prettier-vscode"},
- "[vue]": {"editor.defaultFormatter": "esbenp.prettier-vscode"}
-}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3cf3b73d..af6ca99d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4086 +1,38 @@
# Change Log
All notable changes to this project will be documented in this file.
+This project adheres to [Semantic Versioning](http://semver.org/).
-
+
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-rc.3...v3.0.0-rc.4)
+## 2.0.0-pre.5 - 2016-08-07 [Pre-release]
-This is a release candidate (RC) for v3.0.0 to ensure maximum stability for public release.
-Bugs may be fixed, but no further features will be added until the next stable version.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-yarn global add thelounge@next
-```
-
-## v3.0.0-rc.3 - 2018-10-10 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-rc.2...v3.0.0-rc.3)
-
-This is a release candidate (RC) for v3.0.0 to ensure maximum stability for public release.
-Bugs may be fixed, but no further features will be added until the next stable version.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-yarn global add thelounge@next
-```
-
-## v3.0.0-rc.2 - 2018-10-08 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-rc.1...v3.0.0-rc.2)
-
-This is a release candidate (RC) for v3.0.0 to ensure maximum stability for public release.
-Bugs may be fixed, but no further features will be added until the next stable version.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-yarn global add thelounge@next
-```
-
-## v3.0.0-rc.1 - 2018-09-20 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.8...v3.0.0-rc.1)
-
-This is a release candidate (RC) for v3.0.0 to ensure maximum stability for public release.
-Bugs may be fixed, but no further features will be added until the next stable version.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-yarn global add thelounge@next
-```
-
-## v3.0.0-pre.8 - 2018-08-25 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.7...v3.0.0-pre.8)
-
-This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release.
-At this stage, features may still be added or modified until the first release candidate for this version gets released.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-yarn global add thelounge@next
-```
-
-## v3.0.0-pre.7 - 2018-06-19 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.6...v3.0.0-pre.7)
-
-This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release.
-At this stage, features may still be added or modified until the first release candidate for this version gets released.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v3.0.0-pre.6 - 2018-05-26 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.5...v3.0.0-pre.6)
-
-This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release.
-At this stage, features may still be added or modified until the first release candidate for this version gets released.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v3.0.0-pre.5 - 2018-03-28 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.4...v3.0.0-pre.5)
-
-This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release.
-At this stage, features may still be added or modified until the first release candidate for this version gets released.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v3.0.0-pre.4 - 2018-03-27 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.3...v3.0.0-pre.4)
-
-This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release.
-At this stage, features may still be added or modified until the first release candidate for this version gets released.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v3.0.0-pre.3 - 2018-03-08 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.2...v3.0.0-pre.3)
-
-This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release.
-At this stage, features may still be added or modified until the first release candidate for this version gets released.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v3.0.0-pre.2 - 2018-03-03 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v3.0.0-pre.1...v3.0.0-pre.2)
-
-This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release.
-At this stage, features may still be added or modified until the first release candidate for this version gets released.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v3.0.0-pre.1 - 2018-02-21 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.1...v3.0.0-pre.1)
-
-This is a pre-release for v3.0.0 to offer latest changes without having to wait for a stable release.
-At this stage, features may still be added or modified until the first release candidate for this version gets released.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.7.1 - 2018-02-18
-
-For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0...v2.7.1) and [milestone](https://github.com/thelounge/thelounge/milestone/29?closed=1).
-
-This releases mainly fixes bugs that were introduced by previous versions, and comes with very minor improvements to the UI. Among other things, we fixed the unread markers showing multiple times, which in turn fixes memory leaks when keeping The Lounge open for long periods of time (e.g. overnight).
-
-This simply ensures we did not leave any unattended bugs before going for The Lounge v3.
-
-### Changed
-
-- Autocomplete channels on the current network ([#1993](https://github.com/thelounge/thelounge/pull/1993) by [@milindl](https://github.com/milindl))
-- Set `decoding="async"` on image previews ([#1924](https://github.com/thelounge/thelounge/pull/1924) by [@xPaw](https://github.com/xPaw))
-- Add tooltip to channel close button ([#1856](https://github.com/thelounge/thelounge/pull/1856) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Show channel name on channel-related errors ([#1933](https://github.com/thelounge/thelounge/pull/1933) by [@RockyTV](https://github.com/RockyTV))
-- Display password field when `displayNetwork` is false ([#2066](https://github.com/thelounge/thelounge/pull/2066) by [@xPaw](https://github.com/xPaw))
-- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `semver` ([#1985](https://github.com/thelounge/thelounge/pull/1985))
- - `primer-tooltips` ([#1988](https://github.com/thelounge/thelounge/pull/1988))
- - `lodash` ([#2032](https://github.com/thelounge/thelounge/pull/2032))
- - `commander` ([#2038](https://github.com/thelounge/thelounge/pull/2038), [#2041](https://github.com/thelounge/thelounge/pull/2041))
- - `urijs` ([#2053](https://github.com/thelounge/thelounge/pull/2053))
- - `mime-types` ([#2067](https://github.com/thelounge/thelounge/pull/2067))
-
-### Fixed
-
-- Prevent user context menu from opening while selecting text ([#1955](https://github.com/thelounge/thelounge/pull/1955) by [@xPaw](https://github.com/xPaw))
-- Fix timestamp tooltips not aligning correctly with timestamps ([#1999](https://github.com/thelounge/thelounge/pull/1999) by [@astorije](https://github.com/astorije))
-- Set `start_url` in `manifest.json` so that The Lounge always opens the correct window ([#2010](https://github.com/thelounge/thelounge/pull/2010) by [@xPaw](https://github.com/xPaw))
-- Do not statically serve the index template prior to rendering it ([#1979](https://github.com/thelounge/thelounge/pull/1979) by [@astorije](https://github.com/astorije))
-- Persist query windows between server restarts ([#2019](https://github.com/thelounge/thelounge/pull/2019) by [@McInkay](https://github.com/McInkay))
-- Preload preview images before appending them to DOM ([#1925](https://github.com/thelounge/thelounge/pull/1925) by [@xPaw](https://github.com/xPaw))
-- Fix `textcomplete` reference in `autocompletion.disable` ([#2023](https://github.com/thelounge/thelounge/pull/2023) by [@xPaw](https://github.com/xPaw))
-- Send visible defaults when `displayNetwork` is `false` ([#2025](https://github.com/thelounge/thelounge/pull/2025) by [@xPaw](https://github.com/xPaw))
-- Wait for server response when parting channels ([#2020](https://github.com/thelounge/thelounge/pull/2020) by [@xPaw](https://github.com/xPaw))
-- Fix auto-open media option not working ([#2027](https://github.com/thelounge/thelounge/pull/2027) by [@xPaw](https://github.com/xPaw))
-- Do not block `/join` command from being sent ([#2013](https://github.com/thelounge/thelounge/pull/2013) by [@xPaw](https://github.com/xPaw))
-- Define which message types should not be logged ([#2022](https://github.com/thelounge/thelounge/pull/2022) by [@xPaw](https://github.com/xPaw))
-- Fix messages not being condensed correctly ([#2030](https://github.com/thelounge/thelounge/pull/2030) by [@xPaw](https://github.com/xPaw))
-- Fix queries going to lobby if the network name matches user name ([#2037](https://github.com/thelounge/thelounge/pull/2037) by [@xPaw](https://github.com/xPaw))
-- Fix default theme not being correct ([#2033](https://github.com/thelounge/thelounge/pull/2033) by [@xPaw](https://github.com/xPaw))
-- Fix duplicate chat containers and unread markers when reconnecting ([#2039](https://github.com/thelounge/thelounge/pull/2039) by [@xPaw](https://github.com/xPaw))
-- Fix crash when hostname is changed in lockNetwork mode ([#2042](https://github.com/thelounge/thelounge/pull/2042) by [@xPaw](https://github.com/xPaw))
-- Still render link previews if image fails to load ([#2043](https://github.com/thelounge/thelounge/pull/2043) by [@xPaw](https://github.com/xPaw))
-- Make sure packages can be referenced in subfolders ([#2045](https://github.com/thelounge/thelounge/pull/2045) by [@xPaw](https://github.com/xPaw))
-- Ensure packages loaded are directories ([#2035](https://github.com/thelounge/thelounge/pull/2035) by [@astorije](https://github.com/astorije), [#2060](https://github.com/thelounge/thelounge/pull/2060) by [@xPaw](https://github.com/xPaw))
-- Fix border after nickname not taking full height ([#2055](https://github.com/thelounge/thelounge/pull/2055) by [@xPaw](https://github.com/xPaw))
-- Provide exact version into `npm install` command ([#2063](https://github.com/thelounge/thelounge/pull/2063) by [@xPaw](https://github.com/xPaw))
-- Track channel state to allow removing channels user is not in ([#2058](https://github.com/thelounge/thelounge/pull/2058) by [@xPaw](https://github.com/xPaw))
-- Allow scaling the page ([#1910](https://github.com/thelounge/thelounge/pull/1910) by [@xPaw](https://github.com/xPaw))
-- Fix `bind` not being passed to `irc-framework` ([#2071](https://github.com/thelounge/thelounge/pull/2071) by [@xPaw](https://github.com/xPaw))
-
-### Security
-
-- Allow stylesheets to be served behind HTTPS in CSP rules ([#2014](https://github.com/thelounge/thelounge/pull/2014) by [@McInkay](https://github.com/McInkay))
-
-### Internals
-
-- Build template list at Webpack time instead of manually keeping this in sync with the views folders ([#1931](https://github.com/thelounge/thelounge/pull/1931) by [@astorije](https://github.com/astorije))
-- Remove deprecated jQuery calls ([#2015](https://github.com/thelounge/thelounge/pull/2015) by [@xPaw](https://github.com/xPaw))
-- Unbind image events after the image is loaded ([#2047](https://github.com/thelounge/thelounge/pull/2047) by [@xPaw](https://github.com/xPaw))
-- Use forked ldapjs to remove dtrace ([#2021](https://github.com/thelounge/thelounge/pull/2021) by [@xPaw](https://github.com/xPaw))
-- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `eslint` ([#1992](https://github.com/thelounge/thelounge/pull/1992), [#2029](https://github.com/thelounge/thelounge/pull/2029), [#2068](https://github.com/thelounge/thelounge/pull/2068))
- - `mocha` ([#1989](https://github.com/thelounge/thelounge/pull/1989), [#2061](https://github.com/thelounge/thelounge/pull/2061))
- - `jquery` ([#1994](https://github.com/thelounge/thelounge/pull/1994))
- - `copy-webpack-plugin` ([#2046](https://github.com/thelounge/thelounge/pull/2046), [#2048](https://github.com/thelounge/thelounge/pull/2048))
- - `webpack` ([#2052](https://github.com/thelounge/thelounge/pull/2052))
- - `stylelint-config-standard` ([#2070](https://github.com/thelounge/thelounge/pull/2070))
-
-## v2.7.0 - 2018-01-28
-
-For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.6.0...v2.7.0) and [milestone](https://github.com/thelounge/thelounge/milestone/27?closed=1).
-
-The Lounge v2.7.0 is out, and it's a big one! Here is a shortlist of the most notable additions and changes, but as usual, a comprehensive list is available below.
-
-It is now possible to join a channel directly from the UI:
-
-
-
-
- The + button next to any network opens a form to join a channel.
-
-
-Nicks mentioned in messages are now clickable:
-
-
-
-
-
-Context menu actions have been improved, and new actions have been added:
-
-
-
-
- Available actions on nicks in the chat window, and on channels and networks in the channel list
-
-
-A long-awaited feature, it is now possible to add customizable strings when auto-completing nicks at the beginning of a message:
-
-
-
-
- To achieve this, set , in your client settings.
-
-
-The user information available when sending the `/whois` command (or clicking the corresponding action in a user context menu) has been enhanced:
-
-
-
-
-
-Message styling now supports strikethrough text, monospace font, and additional colors:
-
-
-
-
- Strikethrough is achieved with Ctrl /⌘ + S . Monospace is achieved with Ctrl /⌘ + M .
-
-
-The Help window gains a version checker, to inform you if a new version was released:
-
-
-
-
-
-By clicking on the "release notes" link that can be seen above, all the details about the current version appear directly in the client:
-
-
-
-
-
-The link previewer now supports WebP images, as well as audio and video links:
-
-
-
-
-
-Another noticeable change is the new message alignment in the main chat window, in order to improve visual experience and reduce flickering when loading a page:
-
-
-
-
-
-There were other changes on the client: accessibility of the application has been improved, notices and errors are now displayed in the current channel (then sent to the corresponding network window when reloading), and many bug fixes.
-
-The Lounge v2.7.0 finally comes with its first package API, letting packages register stylesheets in the client. It is in its very early stage at the moment and is subject to change in future releases, so use it at your own risk. There will not be an official documentation before the API stabilizes in v3, but for more information, [refer to the corresponding PR](https://github.com/thelounge/thelounge/pull/1619).
-
-The CLI has also been improved:
-
-- When a password gets changed using the `reset` command, the new password takes effect immediately, it is not necessary to restart the server anymore.
-- A new `uninstall` command has been added to remove themes and packages.
-- A new `--config`/`-c` option is available to override entries of the configuration file.
-
-⚠️ This version also comes with a few **deprecations**. All deprecated features are still supported in The Lounge v2.7.0 but be removed from The Lounge v3 (the next version). We recommend upgrading to v2.7.0 **before** upgrading to the future v3, as v2.7.0 will warn you about deprecated configurations in the server output. Those deprecations are:
-
-- Support for Node.js v4 is being removed, making Node.js v6 the oldest version we will support.
-- The `LOUNGE_HOME` environment variable is getting replaced with `THELOUNGE_HOME`. Use this in lieu of the deprecated `--home` option as well.
-- In the unlikely situation that you are relying on the `.lounge_home` file (mainly useful for package maintainers), it is being renamed to `.thelounge_home`.
-- The CLI command is being changed from `lounge` to `thelounge`.
-- All options for the `start` command are being removed, replaced with the `--config`/`-c` option mentioned above. For example, `--public` becomes `-c public=true`, `--port 9001` becomes `-c port=9001`, etc.
-- Referring to themes in the `theme` option of the configuration file is now done through their name, not their CSS file name.
-
-And finally... **The Lounge has its own logo!** 🎉
-
-
-
-
-
-A huge thank you to **Francesca Segantini**, the artist who designed it!
-We will start rolling out our new logo in all the relevant places as of The Lounge v3. In the meantime, you can find details about the logo (and stickers!) on [the corresponding issue](https://github.com/thelounge/thelounge/issues/282#issuecomment-360368920).
-
-### Added
-
-- Link and color nicks mentioned in messages ([#1709](https://github.com/thelounge/thelounge/pull/1709), [#1758](https://github.com/thelounge/thelounge/pull/1758) by [@MaxLeiter](https://github.com/MaxLeiter), [#1779](https://github.com/thelounge/thelounge/pull/1779), [#1901](https://github.com/thelounge/thelounge/pull/1901) by [@xPaw](https://github.com/xPaw))
-- Detect `image/webp` as an image ([#1753](https://github.com/thelounge/thelounge/pull/1753) by [@xPaw](https://github.com/xPaw))
-- Implement strikethrough and monospace formatting ([#1792](https://github.com/thelounge/thelounge/pull/1792) by [@grissly-man](https://github.com/grissly-man), [#1814](https://github.com/thelounge/thelounge/pull/1814) by [@xPaw](https://github.com/xPaw))
-- Add the user's actual IP in the result of `/whois` ([#1788](https://github.com/thelounge/thelounge/pull/1788) by [@PolarizedIons](https://github.com/PolarizedIons))
-- Handle `CHGHOST` cap ([#1578](https://github.com/thelounge/thelounge/pull/1578) by [@xPaw](https://github.com/xPaw))
-- Handle JavaScript errors while loading ([#1794](https://github.com/thelounge/thelounge/pull/1794) by [@xPaw](https://github.com/xPaw), [#1845](https://github.com/thelounge/thelounge/pull/1845) by [@astorije](https://github.com/astorije))
-- Add actions to user context menu ([#1722](https://github.com/thelounge/thelounge/pull/1722) by [@creesch](https://github.com/creesch))
-- Add styling for 16-98 colors ([#1831](https://github.com/thelounge/thelounge/pull/1831) by [@xPaw](https://github.com/xPaw))
-- Add "Channel list" to network context menu ([#1802](https://github.com/thelounge/thelounge/pull/1802) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Support audio file previews ([#1806](https://github.com/thelounge/thelounge/pull/1806) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Support video file previews ([#1817](https://github.com/thelounge/thelounge/pull/1817) by [@MaxLeiter](https://github.com/MaxLeiter), [#1904](https://github.com/thelounge/thelounge/pull/1904) by [@astorije](https://github.com/astorije))
-- Insert user-configurable string when autocompleting nicks ([#1799](https://github.com/thelounge/thelounge/pull/1799) by [@xPaw](https://github.com/xPaw))
-- Add banlist action to channel context menus ([#1858](https://github.com/thelounge/thelounge/pull/1858) by [@YaManicKill](https://github.com/YaManicKill))
-- Join a channel from the UI ([#1836](https://github.com/thelounge/thelounge/pull/1836) by [@MaxLeiter](https://github.com/MaxLeiter), [#1881](https://github.com/thelounge/thelounge/pull/1881), [#1882](https://github.com/thelounge/thelounge/pull/1882) by [@astorije](https://github.com/astorije), [#1916](https://github.com/thelounge/thelounge/pull/1916), [#1917](https://github.com/thelounge/thelounge/pull/1917) by [@williamboman](https://github.com/williamboman))
-- Changelog viewer and updater checker in the client ([#1327](https://github.com/thelounge/thelounge/pull/1327) by [@xPaw](https://github.com/xPaw), [#1897](https://github.com/thelounge/thelounge/pull/1897) by [@astorije](https://github.com/astorije))
-- Add a `thelounge uninstall` command to remove themes and packages ([#1938](https://github.com/thelounge/thelounge/pull/1938), [#1974](https://github.com/thelounge/thelounge/pull/1974) by [@astorije](https://github.com/astorije))
-- Add a package API for custom CSS ([#1619](https://github.com/thelounge/thelounge/pull/1619) by [@YaManicKill](https://github.com/YaManicKill), [#1970](https://github.com/thelounge/thelounge/pull/1970) by [@astorije](https://github.com/astorije))
-
-### Changed
-
-- Parse formatting in real name ([#1689](https://github.com/thelounge/thelounge/pull/1689) by [@xPaw](https://github.com/xPaw))
-- Use service worker to display notifications if available ([#1580](https://github.com/thelounge/thelounge/pull/1580) by [@xPaw](https://github.com/xPaw))
-- Include all available whois info ([#1681](https://github.com/thelounge/thelounge/pull/1681) by [@creesch](https://github.com/creesch), [#1743](https://github.com/thelounge/thelounge/pull/1743) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Focus a channel by joining it, refactor user commands #1189 ([#1491](https://github.com/thelounge/thelounge/pull/1491) by [@realies](https://github.com/realies))
-- Handle hex colors when cleaning string ([#1731](https://github.com/thelounge/thelounge/pull/1731) by [@xPaw](https://github.com/xPaw))
-- Trim channel messages in active channel and when switching channels ([#1738](https://github.com/thelounge/thelounge/pull/1738) by [@xPaw](https://github.com/xPaw))
-- Do not keep scroll to bottom in inactive channels ([#1739](https://github.com/thelounge/thelounge/pull/1739) by [@xPaw](https://github.com/xPaw))
-- Show notices and errors inline ([#1380](https://github.com/thelounge/thelounge/pull/1380) by [@xPaw](https://github.com/xPaw))
-- Ensure passwords are reloaded when updated via CLI ([#1593](https://github.com/thelounge/thelounge/pull/1593) by [@RJacksonm1](https://github.com/RJacksonm1))
-- Warn if user configuration being loaded is empty ([#1821](https://github.com/thelounge/thelounge/pull/1821) by [@astorije](https://github.com/astorije))
-- Align message container to the bottom ([#1787](https://github.com/thelounge/thelounge/pull/1787) by [@xPaw](https://github.com/xPaw))
-- Clear storage folder after successful start and graceful exit ([#1853](https://github.com/thelounge/thelounge/pull/1853) by [@xPaw](https://github.com/xPaw))
-- Format whois as a definition list ([#1850](https://github.com/thelounge/thelounge/pull/1850) by [@xPaw](https://github.com/xPaw))
-- Rename "Client Settings" into "Settings" in tooltip + cleanup ([#1880](https://github.com/thelounge/thelounge/pull/1880) by [@astorije](https://github.com/astorije))
-- Open and focus correct channel when clicking on push notifications ([#1895](https://github.com/thelounge/thelounge/pull/1895) by [@xPaw](https://github.com/xPaw))
-- Add screen reader label for custom css textarea ([#1908](https://github.com/thelounge/thelounge/pull/1908) by [@xPaw](https://github.com/xPaw))
-- Set `aria-label` on main input ([#1906](https://github.com/thelounge/thelounge/pull/1906) by [@xPaw](https://github.com/xPaw))
-- Mute disabled inputs ([#1905](https://github.com/thelounge/thelounge/pull/1905) by [@xPaw](https://github.com/xPaw))
-- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `commander` ([#1736](https://github.com/thelounge/thelounge/pull/1736), [#1763](https://github.com/thelounge/thelounge/pull/1763), [#1963](https://github.com/thelounge/thelounge/pull/1963))
- - `moment` ([#1775](https://github.com/thelounge/thelounge/pull/1775), [#1822](https://github.com/thelounge/thelounge/pull/1822), [#1848](https://github.com/thelounge/thelounge/pull/1848), [#1857](https://github.com/thelounge/thelounge/pull/1857))
- - `web-push` ([#1781](https://github.com/thelounge/thelounge/pull/1781))
- - `irc-framework` ([#1782](https://github.com/thelounge/thelounge/pull/1782), [#1937](https://github.com/thelounge/thelounge/pull/1937))
- - `fs-extra` ([#1798](https://github.com/thelounge/thelounge/pull/1798), [#1826](https://github.com/thelounge/thelounge/pull/1826))
- - `ldapjs` ([#1965](https://github.com/thelounge/thelounge/pull/1965))
- - `primer-tooltips` ([#1923](https://github.com/thelounge/thelounge/pull/1923))
-
-### Deprecated
-
-- Deprecate support of Node.js v4 in preparation of The Lounge v3 ([#1715](https://github.com/thelounge/thelounge/pull/1715) by [@astorije](https://github.com/astorije))
-- Deprecate `LOUNGE_HOME` environment variable in favor of `THELOUNGE_HOME`, `.lounge_home` file in favor of `.thelounge_home` ([#1717](https://github.com/thelounge/thelounge/pull/1717), [#1785](https://github.com/thelounge/thelounge/pull/1785) by [@astorije](https://github.com/astorije))
-- Switch CLI tool from `lounge` to `thelounge`, deprecate `lounge` ([#1708](https://github.com/thelounge/thelounge/pull/1708) by [@astorije](https://github.com/astorije))
-- Deprecate existing options of `thelounge start` and add a generic `--config` override ([#1820](https://github.com/thelounge/thelounge/pull/1820) by [@astorije](https://github.com/astorije))
-- Rename thumbnail/image option to more general `media` ([#1832](https://github.com/thelounge/thelounge/pull/1832) by [@MaxLeiter](https://github.com/MaxLeiter))
-
-### Removed
-
-- Remove lobby close button ([#1833](https://github.com/thelounge/thelounge/pull/1833) by [@Cldfire](https://github.com/Cldfire))
-
-### Fixed
-
-- Handle empty client queries ([#1676](https://github.com/thelounge/thelounge/pull/1676) by [@realies](https://github.com/realies))
-- Call callback on fetch error ([#1742](https://github.com/thelounge/thelounge/pull/1742) by [@xPaw](https://github.com/xPaw))
-- Trigger keep to bottom for previews correctly ([#1746](https://github.com/thelounge/thelounge/pull/1746) by [@xPaw](https://github.com/xPaw))
-- Fix duplicate text generated when sending channel and link together ([#1747](https://github.com/thelounge/thelounge/pull/1747) by [@astorije](https://github.com/astorije))
-- Fix text highlighting when clicking on condensed message toggles ([#1748](https://github.com/thelounge/thelounge/pull/1748) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Do not keep sign-in and loader references in memory ([#1757](https://github.com/thelounge/thelounge/pull/1757) by [@xPaw](https://github.com/xPaw))
-- Fix nick changes wrongly reported ([#1772](https://github.com/thelounge/thelounge/pull/1772) by [@astorije](https://github.com/astorije))
-- Clone instances of `User` in `Msg` to avoid unintentional mutations ([#1771](https://github.com/thelounge/thelounge/pull/1771) by [@astorije](https://github.com/astorije), [#1859](https://github.com/thelounge/thelounge/pull/1859), [#1865](https://github.com/thelounge/thelounge/pull/1865) by [@xPaw](https://github.com/xPaw))
-- Ask for notification permission on page load if setting is enabled ([#1789](https://github.com/thelounge/thelounge/pull/1789) by [@xPaw](https://github.com/xPaw))
-- Merge condensed messages when loading more history ([#1803](https://github.com/thelounge/thelounge/pull/1803) by [@xPaw](https://github.com/xPaw))
-- Proper network icon in context menu ([#1816](https://github.com/thelounge/thelounge/pull/1816) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Implement reverse style ([#1797](https://github.com/thelounge/thelounge/pull/1797) by [@grissly-man](https://github.com/grissly-man))
-- Do not load user commands or display them on `--help` if public mode or using LDAP ([#1807](https://github.com/thelounge/thelounge/pull/1807) by [@astorije](https://github.com/astorije))
-- Improve user and channel icons in channel list and context menu ([#1824](https://github.com/thelounge/thelounge/pull/1824) by [@astorije](https://github.com/astorije))
-- Use better icons for channel/query list and context menu actions ([#1829](https://github.com/thelounge/thelounge/pull/1829) by [@astorije](https://github.com/astorije))
-- Fix UI issues with special channels ([#1849](https://github.com/thelounge/thelounge/pull/1849) by [@astorije](https://github.com/astorije))
-- Fix gap between `#sidebar` and `#footer` ([#1691](https://github.com/thelounge/thelounge/pull/1691) by [@realies](https://github.com/realies))
-- Add missing time (and icon) of status messages on mobile ([#1843](https://github.com/thelounge/thelounge/pull/1843) by [@astorije](https://github.com/astorije))
-- Add visual feedback on focused buttons, for example when tabbing to it ([#1871](https://github.com/thelounge/thelounge/pull/1871) by [@astorije](https://github.com/astorije))
-- Fix missing messages when reconnecting ([#1884](https://github.com/thelounge/thelounge/pull/1884) by [@xPaw](https://github.com/xPaw))
-- Fix slideout not closing on mobile when hitting a footer icon ([#1892](https://github.com/thelounge/thelounge/pull/1892) by [@astorije](https://github.com/astorije))
-- Display the correct window on page reload ([#1889](https://github.com/thelounge/thelounge/pull/1889) by [@astorije](https://github.com/astorije))
-- Fix error not showing up in failed push subscription ([#1896](https://github.com/thelounge/thelounge/pull/1896) by [@xPaw](https://github.com/xPaw))
-- Only emit "more" history to the client that requested it ([#1949](https://github.com/thelounge/thelounge/pull/1949) by [@xPaw](https://github.com/xPaw))
-- Provide correct timestamp to browser notifications ([#1956](https://github.com/thelounge/thelounge/pull/1956) by [@xPaw](https://github.com/xPaw))
-- Fix enabling push notifications on Firefox ([#1975](https://github.com/thelounge/thelounge/pull/1975) by [@xPaw](https://github.com/xPaw))
-- Add missing execution of callback in `ClientManager.updateUser` ([#1978](https://github.com/thelounge/thelounge/pull/1978) by [@merlinthp](https://github.com/merlinthp))
-- Make sure existing packages (and themes) are not deleted when installing a new one on Node.js v8 ([#1986](https://github.com/thelounge/thelounge/pull/1986) by [@astorije](https://github.com/astorije))
-- Stop expanding condensed messages on `/expand` ([#2006](https://github.com/thelounge/thelounge/pull/2006) by [@YaManicKill](https://github.com/YaManicKill))
-
-### Security
-
-- Harden content security policy even further ([#1810](https://github.com/thelounge/thelounge/pull/1810) by [@xPaw](https://github.com/xPaw))
-- Stop LDAP authentication from succeeding without password ([#1725](https://github.com/thelounge/thelounge/pull/1725) by [@keegan](https://github.com/keegan))
-- Store images with correct file extension ([#1926](https://github.com/thelounge/thelounge/pull/1926) by [@xPaw](https://github.com/xPaw))
-- Hash user tokens, increase token entropy ([#1940](https://github.com/thelounge/thelounge/pull/1940) by [@xPaw](https://github.com/xPaw))
-
-### Documentation
-
-In the main repository:
-
-- Fix incorrect documentation URL in default config ([#1875](https://github.com/thelounge/thelounge/pull/1875) by [@MiniDigger](https://github.com/MiniDigger))
-- Allow keywords as changelog script version argument, e.g. `node scripts/changelog pre` ([#1913](https://github.com/thelounge/thelounge/pull/1913) by [@astorije](https://github.com/astorije))
-- Separate and improve wording for `pre` and `rc` pre-release versions ([#1914](https://github.com/thelounge/thelounge/pull/1914) by [@astorije](https://github.com/astorije))
-- Add SECURITY guidelines about security vulnerability disclosures, and link them from the CONTRIBUTING guidelines ([#1984](https://github.com/thelounge/thelounge/pull/1984) by [@astorije](https://github.com/astorije))
-
-### Internals
-
-- Enforce dangling commas with ESLint ([#1711](https://github.com/thelounge/thelounge/pull/1711) by [@astorije](https://github.com/astorije))
-- Refactor how user object is sent to the client ([#1698](https://github.com/thelounge/thelounge/pull/1698), [#1716](https://github.com/thelounge/thelounge/pull/1716), [#1720](https://github.com/thelounge/thelounge/pull/1720), [#1764](https://github.com/thelounge/thelounge/pull/1764), [#1941](https://github.com/thelounge/thelounge/pull/1941) by [@xPaw](https://github.com/xPaw), [#1773](https://github.com/thelounge/thelounge/pull/1773) by [@astorije](https://github.com/astorije))
-- Convert users list to map ([#1712](https://github.com/thelounge/thelounge/pull/1712) by [@xPaw](https://github.com/xPaw))
-- Split `index.html` into components ([#1683](https://github.com/thelounge/thelounge/pull/1683) by [@xPaw](https://github.com/xPaw))
-- Parallelize `npm test` ([#1750](https://github.com/thelounge/thelounge/pull/1750) by [@astorije](https://github.com/astorije))
-- Avoid using `npm-run-all` for build ([#1752](https://github.com/thelounge/thelounge/pull/1752) by [@xPaw](https://github.com/xPaw))
-- Avoid escaping quotes whenever possible ([#1749](https://github.com/thelounge/thelounge/pull/1749), [#1759](https://github.com/thelounge/thelounge/pull/1759) by [@astorije](https://github.com/astorije))
-- Mark slow tests as such to reduce noise on test report ([#1761](https://github.com/thelounge/thelounge/pull/1761) by [@astorije](https://github.com/astorije))
-- Increase timeout of server tests ([#1769](https://github.com/thelounge/thelounge/pull/1769) by [@astorije](https://github.com/astorije))
-- Add a bunch of client tests ([#1770](https://github.com/thelounge/thelounge/pull/1770) by [@astorije](https://github.com/astorije))
-- Heavily improve performance of "init" event ([#1778](https://github.com/thelounge/thelounge/pull/1778) by [@xPaw](https://github.com/xPaw))
-- Enable `no-use-before-define` rule ([#1804](https://github.com/thelounge/thelounge/pull/1804) by [@xPaw](https://github.com/xPaw))
-- Update textcomplete library and rewrite tabcomplete ([#1800](https://github.com/thelounge/thelounge/pull/1800) by [@xPaw](https://github.com/xPaw))
-- Clean up path helpers, expand defaults location in `thelounge --help`, add tests for `expandHome` ([#1811](https://github.com/thelounge/thelounge/pull/1811) by [@astorije](https://github.com/astorije))
-- Remove dead code in tests, and fix a link test ([#1818](https://github.com/thelounge/thelounge/pull/1818) by [@astorije](https://github.com/astorije))
-- Use cross-platform modifier shortcut for Mousetrap when possible ([#1844](https://github.com/thelounge/thelounge/pull/1844) by [@astorije](https://github.com/astorije))
-- Update to primer on npm ([#1855](https://github.com/thelounge/thelounge/pull/1855) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Add a `notEqual` block helper for Handlebars and tests for `equal` ([#1874](https://github.com/thelounge/thelounge/pull/1874) by [@astorije](https://github.com/astorije))
-- Use `notEqual` helper for close button ([#1876](https://github.com/thelounge/thelounge/pull/1876) by [@xPaw](https://github.com/xPaw))
-- Improve a bit window loading on init ([#1899](https://github.com/thelounge/thelounge/pull/1899) by [@astorije](https://github.com/astorije))
-- Fix stylelint ([#1921](https://github.com/thelounge/thelounge/pull/1921) by [@astorije](https://github.com/astorije))
-- Set `sign-git-tag` to true in `.npmrc` ([#1964](https://github.com/thelounge/thelounge/pull/1964) by [@xPaw](https://github.com/xPaw))
-- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `copy-webpack-plugin` ([#1713](https://github.com/thelounge/thelounge/pull/1713), [#1737](https://github.com/thelounge/thelounge/pull/1737), [#1837](https://github.com/thelounge/thelounge/pull/1837), [#1877](https://github.com/thelounge/thelounge/pull/1877))
- - `eslint` ([#1744](https://github.com/thelounge/thelounge/pull/1744), [#1777](https://github.com/thelounge/thelounge/pull/1777), [#1815](https://github.com/thelounge/thelounge/pull/1815), [#1828](https://github.com/thelounge/thelounge/pull/1828), [#1887](https://github.com/thelounge/thelounge/pull/1887), [#1947](https://github.com/thelounge/thelounge/pull/1947))
- - `stylelint` ([#1745](https://github.com/thelounge/thelounge/pull/1745), [#1751](https://github.com/thelounge/thelounge/pull/1751), [#1841](https://github.com/thelounge/thelounge/pull/1841))
- - `webpack` ([#1780](https://github.com/thelounge/thelounge/pull/1780), [#1796](https://github.com/thelounge/thelounge/pull/1796))
- - `intersection-observer` ([#1790](https://github.com/thelounge/thelounge/pull/1790))
- - `textcomplete` ([#1835](https://github.com/thelounge/thelounge/pull/1835), [#1854](https://github.com/thelounge/thelounge/pull/1854))
- - `nyc` ([#1863](https://github.com/thelounge/thelounge/pull/1863))
- - `graphql-request` ([#1903](https://github.com/thelounge/thelounge/pull/1903))
- - `mocha` ([#1922](https://github.com/thelounge/thelounge/pull/1922))
-
-## v2.7.0-rc.3 - 2018-01-27 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0-rc.2...v2.7.0-rc.3)
-
-This is a release candidate (RC) for v2.7.0 to ensure maximum stability for public release.
-Bugs may be fixed, but no further features will be added until the next stable version.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.7.0-rc.2 - 2018-01-19 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0-rc.1...v2.7.0-rc.2)
-
-This is a release candidate (RC) for v2.7.0 to ensure maximum stability for public release.
-Bugs may be fixed, but no further features will be added until the next stable version.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.7.0-rc.1 - 2018-01-13 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0-pre.4...v2.7.0-rc.1)
-
-This is a release candidate (RC) for v2.7.0 to ensure maximum stability for public release.
-Bugs may be fixed, but no further features will be added until the next stable version.
-
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.7.0-pre.4 - 2017-12-27 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0-pre.3...v2.7.0-pre.4)
-
-This is a pre-release for v2.7.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.7.0-pre.3 - 2017-12-15 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0-pre.2...v2.7.0-pre.3)
-
-This is a pre-release for v2.7.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.7.0-pre.2 - 2017-12-01 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.7.0-pre.1...v2.7.0-pre.2)
-
-This is a pre-release for v2.7.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.7.0-pre.1 - 2017-11-30 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.6.0...v2.7.0-pre.1)
-
-This is a pre-release for v2.7.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.6.0 - 2017-11-18
-
-For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.5.0...v2.6.0) and [milestone](https://github.com/thelounge/thelounge/milestone/26?closed=1).
-
-This release is very small, as we focused it on bug fixes. You may notice slight improvements to the auto-completion menu (new commands, more accurate emoji list, documentation in the help window), as well as small UI improvements.
-
-Additionally, this release is the first one with official support of Node.js v9.
-
-### Added
-
-- Add service aliases to command list for completion ([#1627](https://github.com/thelounge/thelounge/pull/1627) by [@dgw](https://github.com/dgw))
-
-### Changed
-
-- Mark channels as read when receiving self-messages ([#1615](https://github.com/thelounge/thelounge/pull/1615) by [@dgw](https://github.com/dgw))
-- Remove content borders on mobile to maximize use of space ([#1599](https://github.com/thelounge/thelounge/pull/1599) by [@RJacksonm1](https://github.com/RJacksonm1))
-- Reduced padding around page titles ([#1637](https://github.com/thelounge/thelounge/pull/1637) by [@Swapnull](https://github.com/Swapnull))
-- Generate emoji map from EmojiOne data ([#1651](https://github.com/thelounge/thelounge/pull/1651), [#1670](https://github.com/thelounge/thelounge/pull/1670) by [@xPaw](https://github.com/xPaw))
-- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `moment` ([#1624](https://github.com/thelounge/thelounge/pull/1624), [#1638](https://github.com/thelounge/thelounge/pull/1638), [#1702](https://github.com/thelounge/thelounge/pull/1702))
- - `socket.io` ([#1625](https://github.com/thelounge/thelounge/pull/1625), [#1660](https://github.com/thelounge/thelounge/pull/1660))
- - `express` ([#1638](https://github.com/thelounge/thelounge/pull/1638))
- - `ua-parser-js` ([#1638](https://github.com/thelounge/thelounge/pull/1638))
- - `web-push` ([#1654](https://github.com/thelounge/thelounge/pull/1654))
-
-### Removed
-
-- Remove Inconsolata ([#1602](https://github.com/thelounge/thelounge/pull/1602) by [@xPaw](https://github.com/xPaw))
-
-### Fixed
-
-- Fix possible race condition when attaching clients ([#1639](https://github.com/thelounge/thelounge/pull/1639) by [@xPaw](https://github.com/xPaw))
-- Synchronize unread marker when client reconnects ([#1600](https://github.com/thelounge/thelounge/pull/1600) by [@xPaw](https://github.com/xPaw))
-- Synchronize unread marker when other client opens a channel ([#1598](https://github.com/thelounge/thelounge/pull/1598) by [@xPaw](https://github.com/xPaw))
-- Fix loading app with autocomplete disabled ([#1650](https://github.com/thelounge/thelounge/pull/1650) by [@dgw](https://github.com/dgw))
-- Fix URL query parameters in public mode ([#1661](https://github.com/thelounge/thelounge/pull/1661) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Fix hyphenated names overflowing (#1667) ([#1671](https://github.com/thelounge/thelounge/pull/1671) by [@LFlare](https://github.com/LFlare))
-- Fix missing attributes on unhandled messages ([#1695](https://github.com/thelounge/thelounge/pull/1695) by [@xPaw](https://github.com/xPaw))
-- Correctly display kicks when kicker is server ([#1693](https://github.com/thelounge/thelounge/pull/1693) by [@xPaw](https://github.com/xPaw))
-- Go back to writing user files synchronously ([#1701](https://github.com/thelounge/thelounge/pull/1701) by [@xPaw](https://github.com/xPaw))
-- Fix local theme folder ([#1706](https://github.com/thelounge/thelounge/pull/1706) by [@xPaw](https://github.com/xPaw))
-
-### Documentation
-
-In the main repository:
-
-- Fix "help wanted" link in CONTRIBUTING file ([#1673](https://github.com/thelounge/thelounge/pull/1673) by [@timmw](https://github.com/timmw))
-- Document autocompletion in the help page ([#1609](https://github.com/thelounge/thelounge/pull/1609) by [@dgw](https://github.com/dgw))
-- Add a script to pre-generate changelog entries ([#1707](https://github.com/thelounge/thelounge/pull/1707) by [@astorije](https://github.com/astorije))
-
-### Internals
-
-- Remove channel containers from DOM after quitting network ([#1607](https://github.com/thelounge/thelounge/pull/1607) by [@PolarizedIons](https://github.com/PolarizedIons))
-- Create public folder with Webpack ([#1611](https://github.com/thelounge/thelounge/pull/1611), [#1682](https://github.com/thelounge/thelounge/pull/1682), [#1704](https://github.com/thelounge/thelounge/pull/1704) by [@xPaw](https://github.com/xPaw), [#1705](https://github.com/thelounge/thelounge/pull/1705) by [@astorije](https://github.com/astorije))
-- Cleanup client manager functions ([#1636](https://github.com/thelounge/thelounge/pull/1636) by [@xPaw](https://github.com/xPaw))
-- Add Node.js v9 testing to Travis builds ([#1678](https://github.com/thelounge/thelounge/pull/1678) by [@astorije](https://github.com/astorije))
-- Allow `run-pr` script to pass arguments to `npm start` ([#1662](https://github.com/thelounge/thelounge/pull/1662) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `webpack` ([#1626](https://github.com/thelounge/thelounge/pull/1626), [#1638](https://github.com/thelounge/thelounge/pull/1638), [#1643](https://github.com/thelounge/thelounge/pull/1643))
- - `mocha` ([#1617](https://github.com/thelounge/thelounge/pull/1617))
- - `stylelint` ([#1616](https://github.com/thelounge/thelounge/pull/1616))
- - `eslint` ([#1632](https://github.com/thelounge/thelounge/pull/1632), [#1666](https://github.com/thelounge/thelounge/pull/1666), [#1699](https://github.com/thelounge/thelounge/pull/1699))
- - `babel-preset-env` ([#1641](https://github.com/thelounge/thelounge/pull/1641))
- - `handlebars` ([#1645](https://github.com/thelounge/thelounge/pull/1645))
- - `socket.io-client` ([#1659](https://github.com/thelounge/thelounge/pull/1659))
- - `copy-webpack-plugin` ([#1653](https://github.com/thelounge/thelounge/pull/1653))
- - `nyc` ([#1680](https://github.com/thelounge/thelounge/pull/1680))
- - `npm-run-all` ([#1688](https://github.com/thelounge/thelounge/pull/1688))
- - `intersection-observer` ([#1697](https://github.com/thelounge/thelounge/pull/1697))
-
-## v2.6.0-rc.4 - 2017-11-12 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.6.0-rc.3...v2.6.0-rc.4)
-
-This is a release candidate for v2.6.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.6.0-rc.3 - 2017-11-12 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.6.0-rc.2...v2.6.0-rc.3)
-
-This is a release candidate for v2.6.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.6.0-rc.2 - 2017-11-12 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.6.0-rc.1...v2.6.0-rc.2)
-
-This is a release candidate for v2.6.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.6.0-rc.1 - 2017-11-11 [Pre-release - DEPRECATED]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.5.0...v2.6.0-rc.1)
-
-This is a release candidate for v2.6.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.5.0 - 2017-10-17
-
-For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.4.0...v2.5.0) and [milestone](https://github.com/thelounge/thelounge/milestone/22?closed=1).
-
-If you thought the [v2.3.0 release](https://github.com/thelounge/thelounge/releases/tag/v2.3.0) was big, well, v2.5.0 is even bigger! 🎉
-
-If you are a client user, you will notice that The Lounge is now using your operating system's font, and that status messages (joins, parts, nick changes, etc.) are now condensed with each other.
-
-
-
-
- Condensed status messages
-
-
-After a while, you'll realize that the client now automatically reconnects when losing network connection (farewell, `Client connection lost — Click here to reconnect`!), and that the channel backlog now automatically loads when you scroll up. Unfortunately, that last bit forced us to phase out the `/clear` command for technical reasons.
-
-If you go to the _Settings_ page, you'll notice that The Lounge now supports push notifications (yes, even on mobile, except iOS), and that you can remotely log out open sessions.
-
-
-
-
- Current and remote sessions
-
-
-As a server administrator, you might be interested in a few new additions:
-
-- Themes can now be [retrieved from npm](https://www.npmjs.com/search?q=keywords%3Athelounge-theme) and installed using a new CLI command `lounge install `
-- Integration with LDAP has been completely refactored
-- The Lounge can now be bound to Unix sockets
-
-⚠️ Note that `--home` is now deprecated in favor of the `$LOUNGE_HOME` environment variable (or the `.lounge_home` file in the installation directory). Also, if you are running The Lounge behind a proxy (like nginx or Apache), you will need to make sure that `reverseProxy` is set to `true` and the `X-Forwarded-For` header correctly set for session listing to work correctly on the client.
-
-Enjoy! 💬
-
-### Added
-
-- Status message condensing ([#759](https://github.com/thelounge/thelounge/pull/759), [#1421](https://github.com/thelounge/thelounge/pull/1421) by [@YaManicKill](https://github.com/YaManicKill), [#1437](https://github.com/thelounge/thelounge/pull/1437), [#1451](https://github.com/thelounge/thelounge/pull/1451), [#1475](https://github.com/thelounge/thelounge/pull/1475), [#1485](https://github.com/thelounge/thelounge/pull/1485) by [@xPaw](https://github.com/xPaw), [#1417](https://github.com/thelounge/thelounge/pull/1417), [#1442](https://github.com/thelounge/thelounge/pull/1442), [#1509](https://github.com/thelounge/thelounge/pull/1509), [#1524](https://github.com/thelounge/thelounge/pull/1524) by [@astorije](https://github.com/astorije))
-- Use `.lounge_home` to help distribution packages handle config paths right ([#1416](https://github.com/thelounge/thelounge/pull/1416), [#1587](https://github.com/thelounge/thelounge/pull/1587) by [@xPaw](https://github.com/xPaw), [#1418](https://github.com/thelounge/thelounge/pull/1418) by [@astorije](https://github.com/astorije))
-- Implement push notifications ([#1124](https://github.com/thelounge/thelounge/pull/1124), [#1445](https://github.com/thelounge/thelounge/pull/1445), [#1572](https://github.com/thelounge/thelounge/pull/1572), [#1468](https://github.com/thelounge/thelounge/pull/1468) by [@xPaw](https://github.com/xPaw), [#1463](https://github.com/thelounge/thelounge/pull/1463) by [@astorije](https://github.com/astorije))
-- Set default `/quit` message ([#1448](https://github.com/thelounge/thelounge/pull/1448) by [@xPaw](https://github.com/xPaw))
-- Gracefully quit on Ctrl +C ([#1477](https://github.com/thelounge/thelounge/pull/1477) by [@xPaw](https://github.com/xPaw))
-- Add `/rejoin` command (a.k.a. `/cycle`) ([#1449](https://github.com/thelounge/thelounge/pull/1449) by [@dgw](https://github.com/dgw))
-- Add support for binding to Unix sockets ([#1479](https://github.com/thelounge/thelounge/pull/1479) by [@xPaw](https://github.com/xPaw))
-- Automatically load history when scrolling upwards ([#1318](https://github.com/thelounge/thelounge/pull/1318) by [@xPaw](https://github.com/xPaw))
-- Use `away-notify` to show updates on users away state ([#845](https://github.com/thelounge/thelounge/pull/845) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Allow themes from npm ([#1266](https://github.com/thelounge/thelounge/pull/1266) by [@YaManicKill](https://github.com/YaManicKill), [#1542](https://github.com/thelounge/thelounge/pull/1542) by [@xPaw](https://github.com/xPaw))
-- Add anchor tag to URL to signify open page for reloading ([#1283](https://github.com/thelounge/thelounge/pull/1283) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Automatic client reconnection ([#1471](https://github.com/thelounge/thelounge/pull/1471), [#1549](https://github.com/thelounge/thelounge/pull/1549) by [@xPaw](https://github.com/xPaw))
-- Create `lounge install` command ([#1539](https://github.com/thelounge/thelounge/pull/1539), [#1579](https://github.com/thelounge/thelounge/pull/1579) by [@xPaw](https://github.com/xPaw), [#1583](https://github.com/thelounge/thelounge/pull/1583) by [@astorije](https://github.com/astorije))
-
-### Changed
-
-- Change history button text while loading ([#1403](https://github.com/thelounge/thelounge/pull/1403) by [@xPaw](https://github.com/xPaw))
-- Resolve relative URIs in link previewer ([#1410](https://github.com/thelounge/thelounge/pull/1410) by [@xPaw](https://github.com/xPaw))
-- Remove 10-second interval to trim buffer ([#1409](https://github.com/thelounge/thelounge/pull/1409) by [@xPaw](https://github.com/xPaw))
-- Refactor authentication flow ([#1411](https://github.com/thelounge/thelounge/pull/1411) by [@xPaw](https://github.com/xPaw))
-- Only match emoji autocomplete after two characters ([#1356](https://github.com/thelounge/thelounge/pull/1356) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Improve CLI user management ([#1443](https://github.com/thelounge/thelounge/pull/1443) by [@astorije](https://github.com/astorije))
-- Bigger font size ([#1153](https://github.com/thelounge/thelounge/pull/1153) by [@bews](https://github.com/bews), [#1553](https://github.com/thelounge/thelounge/pull/1553), [#1561](https://github.com/thelounge/thelounge/pull/1561), [#1610](https://github.com/thelounge/thelounge/pull/1610) by [@astorije](https://github.com/astorije))
-- Extend fuzzy search in autocomplete to all strategies ([#1387](https://github.com/thelounge/thelounge/pull/1387) by [@yashsriv](https://github.com/yashsriv))
-- Only create config folder in `start` command ([#1350](https://github.com/thelounge/thelounge/pull/1350) by [@xPaw](https://github.com/xPaw))
-- Parse emoji to make them bigger ([#1446](https://github.com/thelounge/thelounge/pull/1446) by [@xPaw](https://github.com/xPaw), [#1481](https://github.com/thelounge/thelounge/pull/1481) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Process chat messages in `requestIdleCallback` if available ([#1457](https://github.com/thelounge/thelounge/pull/1457) by [@xPaw](https://github.com/xPaw))
-- Completely refactor how date markers are inserted ([#1452](https://github.com/thelounge/thelounge/pull/1452) by [@xPaw](https://github.com/xPaw))
-- Bump default image prefetch limit ([#1490](https://github.com/thelounge/thelounge/pull/1490) by [@astorije](https://github.com/astorije))
-- Take an optional argument in `/part` ([#1476](https://github.com/thelounge/thelounge/pull/1476) by [@eliemichel](https://github.com/eliemichel))
-- Checkered background for transparent images in image viewer ([#1511](https://github.com/thelounge/thelounge/pull/1511) by [@xPaw](https://github.com/xPaw))
-- Use native font stack ([#1540](https://github.com/thelounge/thelounge/pull/1540) by [@xPaw](https://github.com/xPaw), [#1597](https://github.com/thelounge/thelounge/pull/1597) by [@astorije](https://github.com/astorije))
-- Add `touch-action` to messages, sidebar, and user list ([#1520](https://github.com/thelounge/thelounge/pull/1520) by [@iamstratos](https://github.com/iamstratos))
-- Handle browser history when opening/closing image preview ([#1503](https://github.com/thelounge/thelounge/pull/1503) by [@astorije](https://github.com/astorije))
-- Abort image prefetch if `Content-Length` exceeds limit ([#1567](https://github.com/thelounge/thelounge/pull/1567) by [@dgw](https://github.com/dgw))
-- Use monospace font in custom CSS textarea ([#1552](https://github.com/thelounge/thelounge/pull/1552) by [@astorije](https://github.com/astorije))
-- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `irc-framework` ([#1379](https://github.com/thelounge/thelounge/pull/1379), [#1385](https://github.com/thelounge/thelounge/pull/1385))
- - `fs-extra` ([#1386](https://github.com/thelounge/thelounge/pull/1386), [#1521](https://github.com/thelounge/thelounge/pull/1521))
- - `urijs` ([#1401](https://github.com/thelounge/thelounge/pull/1401), [#1405](https://github.com/thelounge/thelounge/pull/1405), [#1604](https://github.com/thelounge/thelounge/pull/1604))
- - `express` ([#1426](https://github.com/thelounge/thelounge/pull/1426), [#1589](https://github.com/thelounge/thelounge/pull/1589))
- - `ua-parser-js` ([#1426](https://github.com/thelounge/thelounge/pull/1426))
- - `web-push` ([#1516](https://github.com/thelounge/thelounge/pull/1516))
- - `request` ([#1546](https://github.com/thelounge/thelounge/pull/1546), [#1577](https://github.com/thelounge/thelounge/pull/1577))
-
-### Removed
-
-- Remove `os.homedir()` polyfill ([#1419](https://github.com/thelounge/thelounge/pull/1419) by [@xPaw](https://github.com/xPaw))
-- Get rid of `/clear` command and keybind ([#1526](https://github.com/thelounge/thelounge/pull/1526) by [@astorije](https://github.com/astorije))
-
-### Fixed
-
-- Correctly append OS name ([#1399](https://github.com/thelounge/thelounge/pull/1399) by [@xPaw](https://github.com/xPaw))
-- Correctly dereference stored images when leaving channels ([#1406](https://github.com/thelounge/thelounge/pull/1406) by [@xPaw](https://github.com/xPaw))
-- Do not throw an exception when URI parsing fails ([#1412](https://github.com/thelounge/thelounge/pull/1412) by [@xPaw](https://github.com/xPaw))
-- Take into account word boundaries for custom highlighting ([#1358](https://github.com/thelounge/thelounge/pull/1358) by [@starquake](https://github.com/starquake))
-- Do not unintentionally send incorrect messages from history ([#1444](https://github.com/thelounge/thelounge/pull/1444) by [@xPaw](https://github.com/xPaw))
-- Escape channel names in slugify helper correctly ([#1472](https://github.com/thelounge/thelounge/pull/1472) by [@xPaw](https://github.com/xPaw))
-- Format messages on copy ([#1464](https://github.com/thelounge/thelounge/pull/1464) by [@xPaw](https://github.com/xPaw))
-- Add `/list` to autocomplete ([#1496](https://github.com/thelounge/thelounge/pull/1496) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Only change nick autocompletion when receiving a message ([#1495](https://github.com/thelounge/thelounge/pull/1495) by [@xPaw](https://github.com/xPaw))
-- Render link previews in browser idle event ([#1508](https://github.com/thelounge/thelounge/pull/1508) by [@xPaw](https://github.com/xPaw))
-- Fix image viewer turning black sometimes ([#1512](https://github.com/thelounge/thelounge/pull/1512) by [@xPaw](https://github.com/xPaw))
-- Fix requesting last messages when no message `id` is known ([#1519](https://github.com/thelounge/thelounge/pull/1519), [#1544](https://github.com/thelounge/thelounge/pull/1544) by [@xPaw](https://github.com/xPaw))
-- Display correct kick modes ([#1527](https://github.com/thelounge/thelounge/pull/1527) by [@dgw](https://github.com/dgw))
-- Move unread marker when loading more history ([#1517](https://github.com/thelounge/thelounge/pull/1517) by [@xPaw](https://github.com/xPaw))
-- Fix wrongly positioned menu when opening it and switching to landscape ([#1565](https://github.com/thelounge/thelounge/pull/1565) by [@astorije](https://github.com/astorije))
-- Fix flickering on link hovering, and inconsistencies between chat links and UI links ([#1573](https://github.com/thelounge/thelounge/pull/1573) by [@astorije](https://github.com/astorije))
-- Fix nick change on Safari for Mac and iOS ([#1568](https://github.com/thelounge/thelounge/pull/1568) by [@Gilles123](https://github.com/Gilles123))
-- Make sure channel list close button is really absent when channel is not selected ([#1623](https://github.com/thelounge/thelounge/pull/1623) by [@astorije](https://github.com/astorije))
-
-### Security
-
-- Implement a proper LDAP authentication process ([#1478](https://github.com/thelounge/thelounge/pull/1478) by [@eliemichel](https://github.com/eliemichel))
-- Implement multiple sessions for users ([#1199](https://github.com/thelounge/thelounge/pull/1199) by [@xPaw](https://github.com/xPaw))
-- Deleting a user should log them out ([#1474](https://github.com/thelounge/thelounge/pull/1474) by [@xPaw](https://github.com/xPaw))
-- Remove the "Stay signed in" checkbox at login ([#1465](https://github.com/thelounge/thelounge/pull/1465) by [@astorije](https://github.com/astorije))
-- Implement session list and allow signing out other clients ([#1536](https://github.com/thelounge/thelounge/pull/1536) by [@xPaw](https://github.com/xPaw))
-
-### Documentation
-
-In the main repository:
-
-- Add Stack Overflow link in CONTRIBUTING file ([#1373](https://github.com/thelounge/thelounge/pull/1373) by [@astorije](https://github.com/astorije))
-- Add feature overview in README ([#1427](https://github.com/thelounge/thelounge/pull/1427) by [@xPaw](https://github.com/xPaw))
-- Add documentation for `LOUNGE_HOME` environment variable in the CLI helper ([#1438](https://github.com/thelounge/thelounge/pull/1438) by [@astorije](https://github.com/astorije))
-- Fix general spelling errors ([#1458](https://github.com/thelounge/thelounge/pull/1458) by [@PolarizedIons](https://github.com/PolarizedIons))
-- Remove duplicate keybindings help ([#1543](https://github.com/thelounge/thelounge/pull/1543) by [@xPaw](https://github.com/xPaw))
-
-On the [website repository](https://github.com/thelounge/thelounge.chat):
-
-- Remove wrong and inexistent home option from configuration documentation ([#72](https://github.com/thelounge/thelounge.chat/pull/72) by [@astorije](https://github.com/astorije))
-- Deprecate `--home` in favor of `LOUNGE_HOME` environment variable ([#73](https://github.com/thelounge/thelounge.chat/pull/73) by [@astorije](https://github.com/astorije))
-- Add themes docs ([#69](https://github.com/thelounge/thelounge.chat/pull/69) by [@YaManicKill](https://github.com/YaManicKill))
-- Add missing `prefetchStorage` configuration option to docs ([#74](https://github.com/thelounge/thelounge.chat/pull/74) by [@MiniDigger](https://github.com/MiniDigger))
-
-### Internals
-
-- Get closer to stylelint's standard config ([#1439](https://github.com/thelounge/thelounge/pull/1439) by [@astorije](https://github.com/astorije))
-- Move all auto completion code to a separate file ([#1453](https://github.com/thelounge/thelounge/pull/1453) by [@xPaw](https://github.com/xPaw))
-- Enforce semicolon spacing ([#1488](https://github.com/thelounge/thelounge/pull/1488) by [@xPaw](https://github.com/xPaw))
-- One line server startup errors ([#1492](https://github.com/thelounge/thelounge/pull/1492) by [@xPaw](https://github.com/xPaw))
-- Move even more code out of `lounge.js` ([#1500](https://github.com/thelounge/thelounge/pull/1500) by [@xPaw](https://github.com/xPaw))
-- Remove unnecessary `end()` calls ([#1518](https://github.com/thelounge/thelounge/pull/1518) by [@xPaw](https://github.com/xPaw))
-- Move user log function where it belongs ([#1528](https://github.com/thelounge/thelounge/pull/1528), [#1585](https://github.com/thelounge/thelounge/pull/1585) by [@xPaw](https://github.com/xPaw), [#1535](https://github.com/thelounge/thelounge/pull/1535) by [@astorije](https://github.com/astorije))
-- Enable `no-console` and `no-alert` ESLint rules ([#1538](https://github.com/thelounge/thelounge/pull/1538) by [@astorije](https://github.com/astorije))
-- Use `Mousetrap` for image viewer shortcuts ([#1566](https://github.com/thelounge/thelounge/pull/1566) by [@astorije](https://github.com/astorije))
-- Remove `event-stream` dependency in favor of plain `Buffers` ([#1554](https://github.com/thelounge/thelounge/pull/1554) by [@astorije](https://github.com/astorije))
-- Skip cleanup on Travis ([`da31317`](https://github.com/thelounge/thelounge/commit/da31317156047000819fa0363c435005104aa572) by [@xPaw](https://github.com/xPaw))
-- Remove `--progress` from webpack ([#1608](https://github.com/thelounge/thelounge/pull/1608) by [@xPaw](https://github.com/xPaw))
-- Add tests for invalid URLs ([#1620](https://github.com/thelounge/thelounge/pull/1620) by [@xPaw](https://github.com/xPaw))
-- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `nyc` ([#1382](https://github.com/thelounge/thelounge/pull/1382), [#1498](https://github.com/thelounge/thelounge/pull/1498), [#1505](https://github.com/thelounge/thelounge/pull/1505))
- - `mocha` ([#1388](https://github.com/thelounge/thelounge/pull/1388), [#1513](https://github.com/thelounge/thelounge/pull/1513), [#1514](https://github.com/thelounge/thelounge/pull/1514), [#1515](https://github.com/thelounge/thelounge/pull/1515))
- - `chai` ([#1394](https://github.com/thelounge/thelounge/pull/1394), [#1482](https://github.com/thelounge/thelounge/pull/1482))
- - `eslint` ([#1395](https://github.com/thelounge/thelounge/pull/1395), [#1435](https://github.com/thelounge/thelounge/pull/1435), [#1493](https://github.com/thelounge/thelounge/pull/1493), [#1532](https://github.com/thelounge/thelounge/pull/1532), [#1541](https://github.com/thelounge/thelounge/pull/1541), [#1555](https://github.com/thelounge/thelounge/pull/1555), [#1591](https://github.com/thelounge/thelounge/pull/1591))
- - `webpack` ([#1397](https://github.com/thelounge/thelounge/pull/1397), [#1407](https://github.com/thelounge/thelounge/pull/1407), [#1424](https://github.com/thelounge/thelounge/pull/1424), [#1507](https://github.com/thelounge/thelounge/pull/1507), [#1531](https://github.com/thelounge/thelounge/pull/1531))
- - `babel-core` ([#1425](https://github.com/thelounge/thelounge/pull/1425))
- - `babel-loader` ([#1434](https://github.com/thelounge/thelounge/pull/1434))
- - `npm-run-all` ([#1462](https://github.com/thelounge/thelounge/pull/1462), [#1466](https://github.com/thelounge/thelounge/pull/1466))
- - `jquery-textcomplete` ([#1473](https://github.com/thelounge/thelounge/pull/1473))
- - `handlebars-loader` ([#1487](https://github.com/thelounge/thelounge/pull/1487))
- - `stylelint` ([#1499](https://github.com/thelounge/thelounge/pull/1499))
-
-## v2.5.0-rc.5 - 2017-10-11 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.5.0-rc.4...v2.5.0-rc.5)
-
-This is a release candidate for v2.5.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.5.0-rc.4 - 2017-10-06 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.5.0-rc.3...v2.5.0-rc.4)
-
-This is a release candidate for v2.5.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.5.0-rc.3 - 2017-10-04 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.5.0-rc.2...v2.5.0-rc.3)
-
-This is a release candidate for v2.5.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.5.0-rc.2 - 2017-10-01 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.5.0-rc.1...v2.5.0-rc.2)
-
-This is a release candidate for v2.5.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.5.0-rc.1 - 2017-09-26 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.4.0...v2.5.0-rc.1)
-
-This is a release candidate for v2.5.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.4.0 - 2017-07-30
-
-For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.3.2...v2.4.0) and [milestone](https://github.com/thelounge/thelounge/milestone/25?closed=1).
-
-This release improves link and image previews a great deal! On the menu:
-
-- Up to 5 previews are now displayed instead of 1
-- All previews on the current channel can now be hidden or displayed using the `/collapse` and `/expand` commands
-- Thumbnails can be opened in a fullscreen viewer without leaving the app by clicking on them, and cycled using the previous/next buttons or by hitting ← and →
-- Say bye to mixed content warnings: The Lounge can now proxy all images (opt-in option in the server settings) for better privacy
-- Title and description are improved overall
-
-Also in this release, auto-complete feature now has an opt-out option in the client settings, and emoji can be searched using fuzzy-matching:
-
-
-
-### Added
-
-- Add `title` attributes to previews ([#1291](https://github.com/thelounge/thelounge/pull/1291) by [@astorije](https://github.com/astorije))
-- Allow opting out of autocomplete ([#1294](https://github.com/thelounge/thelounge/pull/1294) by [@awalgarg](https://github.com/awalgarg))
-- Add collapse/expand commands to toggle all previews ([#1309](https://github.com/thelounge/thelounge/pull/1309) by [@astorije](https://github.com/astorije))
-- An image viewer popup for thumbnails and image previews, with buttons to previous/next images ([#1325](https://github.com/thelounge/thelounge/pull/1325), [#1365](https://github.com/thelounge/thelounge/pull/1365), [#1368](https://github.com/thelounge/thelounge/pull/1368), [#1367](https://github.com/thelounge/thelounge/pull/1367) by [@astorije](https://github.com/astorije), [#1370](https://github.com/thelounge/thelounge/pull/1370) by [@xPaw](https://github.com/xPaw))
-- Store preview images on disk for privacy, security and caching ([#1307](https://github.com/thelounge/thelounge/pull/1307) by [@xPaw](https://github.com/xPaw))
-- Emoji fuzzy-matching ([#1334](https://github.com/thelounge/thelounge/pull/1334) by [@MaxLeiter](https://github.com/MaxLeiter))
-
-### Changed
-
-- Check status code in link prefetcher ([#1260](https://github.com/thelounge/thelounge/pull/1260) by [@xPaw](https://github.com/xPaw))
-- Check `og:description` before `description` tag in previews ([#1255](https://github.com/thelounge/thelounge/pull/1255) by [@xPaw](https://github.com/xPaw))
-- Check `og:title` before `title` tag in previews ([#1256](https://github.com/thelounge/thelounge/pull/1256) by [@xPaw](https://github.com/xPaw))
-- Do not display preview if there is nothing to preview ([#1273](https://github.com/thelounge/thelounge/pull/1273) by [@xPaw](https://github.com/xPaw))
-- Increase max downloaded bytes for link preview ([#1274](https://github.com/thelounge/thelounge/pull/1274) by [@xPaw](https://github.com/xPaw))
-- Refactor link previews ([#1276](https://github.com/thelounge/thelounge/pull/1276) by [@xPaw](https://github.com/xPaw), [#1378](https://github.com/thelounge/thelounge/pull/1378) by [@astorije](https://github.com/astorije))
-- Support multiple previews per message ([#1303](https://github.com/thelounge/thelounge/pull/1303), [#1324](https://github.com/thelounge/thelounge/pull/1324), [#1335](https://github.com/thelounge/thelounge/pull/1335), [#1348](https://github.com/thelounge/thelounge/pull/1348), [#1347](https://github.com/thelounge/thelounge/pull/1347), [#1353](https://github.com/thelounge/thelounge/pull/1353) by [@astorije](https://github.com/astorije))
-- Add `mask-icon` for pinned safari tab ([#1329](https://github.com/thelounge/thelounge/pull/1329) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Lazily load user list in channels on init, keep autocompletion sort on server ([#1194](https://github.com/thelounge/thelounge/pull/1194) by [@xPaw](https://github.com/xPaw))
-- Keep track of preview visibility on the server so it persists at page reload ([#1366](https://github.com/thelounge/thelounge/pull/1366) by [@astorije](https://github.com/astorije))
-- Bump express and socket.io to their latest patch versions ([#1312](https://github.com/thelounge/thelounge/pull/1312) by [@astorije](https://github.com/astorije))
-- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `commander` ([#1257](https://github.com/thelounge/thelounge/pull/1257), [#1292](https://github.com/thelounge/thelounge/pull/1292))
- - `jquery-textcomplete` ([#1279](https://github.com/thelounge/thelounge/pull/1279), [#1321](https://github.com/thelounge/thelounge/pull/1321))
- - `fs-extra` ([#1332](https://github.com/thelounge/thelounge/pull/1332))
- - `semver` ([#1369](https://github.com/thelounge/thelounge/pull/1369))
-
-### Removed
-
-- Remove hostname prettifier ([#1306](https://github.com/thelounge/thelounge/pull/1306) by [@xPaw](https://github.com/xPaw))
-- Remove `X-UA-Compatible` ([#1328](https://github.com/thelounge/thelounge/pull/1328) by [@xPaw](https://github.com/xPaw))
-
-### Fixed
-
-- Make sure thumbnail is a valid image in previews ([#1254](https://github.com/thelounge/thelounge/pull/1254) by [@xPaw](https://github.com/xPaw))
-- Parse `X-Forwarded-For` header correctly ([#1202](https://github.com/thelounge/thelounge/pull/1202) by [@xPaw](https://github.com/xPaw))
-- Do not truncate link previews if viewport can fit more text ([#1293](https://github.com/thelounge/thelounge/pull/1293) by [@xPaw](https://github.com/xPaw))
-- Fix too big line height previews text on Crypto ([#1296](https://github.com/thelounge/thelounge/pull/1296) by [@astorije](https://github.com/astorije))
-- Fix background color contrast on Zenburn previews ([#1297](https://github.com/thelounge/thelounge/pull/1297) by [@astorije](https://github.com/astorije))
-- Fix jumps when toggling link preview ([#1298](https://github.com/thelounge/thelounge/pull/1298) by [@xPaw](https://github.com/xPaw))
-- Fix losing network settings ([#1305](https://github.com/thelounge/thelounge/pull/1305) by [@xPaw](https://github.com/xPaw))
-- Fix missing transitions ([#1314](https://github.com/thelounge/thelounge/pull/1314), [#1336](https://github.com/thelounge/thelounge/pull/1336), [#1374](https://github.com/thelounge/thelounge/pull/1374) by [@astorije](https://github.com/astorije), [#1117](https://github.com/thelounge/thelounge/pull/1117) by [@bews](https://github.com/bews))
-- Fix incorrect mode on kick target ([#1352](https://github.com/thelounge/thelounge/pull/1352) by [@xPaw](https://github.com/xPaw))
-- Correctly show whitespace and newlines in messages ([#1242](https://github.com/thelounge/thelounge/pull/1242) by [@starquake](https://github.com/starquake), [#1359](https://github.com/thelounge/thelounge/pull/1359) by [@xPaw](https://github.com/xPaw))
-- Hide overflow on entire message row ([#1361](https://github.com/thelounge/thelounge/pull/1361) by [@starquake](https://github.com/starquake))
-- Fix link previews not truncating correctly ([#1363](https://github.com/thelounge/thelounge/pull/1363) by [@xPaw](https://github.com/xPaw))
-
-### Documentation
-
-In the main repository:
-
-- Remove mention in CHANGELOG that The Lounge uses Semantic Versioning ([#1269](https://github.com/thelounge/thelounge/pull/1269) by [@astorije](https://github.com/astorije))
-- Remove `devDependencies` badge on README ([#1267](https://github.com/thelounge/thelounge/pull/1267) by [@astorije](https://github.com/astorije))
-- Reword link preview settings to better match reality ([#1310](https://github.com/thelounge/thelounge/pull/1310) by [@astorije](https://github.com/astorije))
-- Update screenshot in README ([#1326](https://github.com/thelounge/thelounge/pull/1326) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Update README badge to new demo URL ([#1345](https://github.com/thelounge/thelounge/pull/1345) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Update README for when to run `npm run build` ([#1319](https://github.com/thelounge/thelounge/pull/1319) by [@MaxLeiter](https://github.com/MaxLeiter))
-
-On the website:
-
-- Update demo URL to new demo ([#70](https://github.com/thelounge/thelounge.chat/pull/70) by [@MaxLeiter](https://github.com/MaxLeiter))
-
-### Internals
-
-- Move nickname rendering to a single template ([#1252](https://github.com/thelounge/thelounge/pull/1252) by [@xPaw](https://github.com/xPaw))
-- Ignore all dotfiles in `.npmignore` ([#1287](https://github.com/thelounge/thelounge/pull/1287) by [@xPaw](https://github.com/xPaw))
-- Add `.npmrc` file with `save-exact` set to `true` so packages are saved already pinned ([#1284](https://github.com/thelounge/thelounge/pull/1284) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Do not hardcode vendor bundles in webpack configuration ([#1280](https://github.com/thelounge/thelounge/pull/1280) by [@xPaw](https://github.com/xPaw))
-- Prepare for `SOURCE` CTCP command, when `irc-framework` supports it ([#1284](https://github.com/thelounge/thelounge/pull/1284) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Change "Show older messages" to use `id` rather than count ([#1354](https://github.com/thelounge/thelounge/pull/1354) by [@YaManicKill](https://github.com/YaManicKill))
-- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `eslint` ([#1264](https://github.com/thelounge/thelounge/pull/1264), [#1272](https://github.com/thelounge/thelounge/pull/1272), [#1315](https://github.com/thelounge/thelounge/pull/1315), [#1362](https://github.com/thelounge/thelounge/pull/1362))
- - `nyc` ([#1277](https://github.com/thelounge/thelounge/pull/1277))
- - `stylelint` ([#1278](https://github.com/thelounge/thelounge/pull/1278), [#1320](https://github.com/thelounge/thelounge/pull/1320), [#1340](https://github.com/thelounge/thelounge/pull/1340))
- - `babel-loader` ([#1282](https://github.com/thelounge/thelounge/pull/1282))
- - `babel-preset-env` ([#1295](https://github.com/thelounge/thelounge/pull/1295))
- - `webpack` ([#1308](https://github.com/thelounge/thelounge/pull/1308), [#1322](https://github.com/thelounge/thelounge/pull/1322), [#1338](https://github.com/thelounge/thelounge/pull/1338), [#1371](https://github.com/thelounge/thelounge/pull/1371), [#1376](https://github.com/thelounge/thelounge/pull/1376))
- - `chai` ([#1323](https://github.com/thelounge/thelounge/pull/1323))
-
-## v2.4.0-rc.2 - 2017-07-27 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.4.0-rc.1...v2.4.0-rc.2)
-
-This is a release candidate for v2.4.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.4.0-rc.1 - 2017-07-27 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.3.2...v2.4.0-rc.1)
-
-This is a release candidate for v2.4.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.3.2 - 2017-06-25
-
-For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.3.1...v2.3.2) and [milestone](https://github.com/thelounge/thelounge/milestone/24?closed=1).
-
-This patch releases brings a lot of fixes and small improvements here and there, as well as the ability to display seconds in timestamps, a long-awaited feature!
-
-### Added
-
-- Add a client option to display seconds in timestamps ([#1141](https://github.com/thelounge/thelounge/pull/1141) by [@bews](https://github.com/bews))
-- Add "Reload page" button when the client fails to load ([#1150](https://github.com/thelounge/thelounge/pull/1150) by [@bews](https://github.com/bews))
-
-### Changed
-
-- Treat `click` as a read activity ([#1214](https://github.com/thelounge/thelounge/pull/1214) by [@xPaw](https://github.com/xPaw))
-- Fade out for long nicks ([#1158](https://github.com/thelounge/thelounge/pull/1158) by [@bews](https://github.com/bews), [#1253](https://github.com/thelounge/thelounge/pull/1253) by [@xPaw](https://github.com/xPaw))
-- Include trickery to reduce paints and improve performance ([#1120](https://github.com/thelounge/thelounge/pull/1120) by [@xPaw](https://github.com/xPaw), [#1083](https://github.com/thelounge/thelounge/pull/1083) by [@bews](https://github.com/bews))
-- Make everything un-selectable by default ([#1233](https://github.com/thelounge/thelounge/pull/1233) by [@xPaw](https://github.com/xPaw))
-- Handle images with unknown size in prefetch ([#1246](https://github.com/thelounge/thelounge/pull/1246) by [@bews](https://github.com/bews))
-- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `spdy` ([#1184](https://github.com/thelounge/thelounge/pull/1184))
-
-### Fixed
-
-- Stop showing the unread messages marker when `joins`/`parts`/`quits`/etc. are hidden ([#1016](https://github.com/thelounge/thelounge/pull/1016) by [@swordbeta](https://github.com/swordbeta))
-- Correctly finish scroll animation when using page keys ([#1244](https://github.com/thelounge/thelounge/pull/1244) by [@xPaw](https://github.com/xPaw))
-- Hide link time element on small devices ([#1261](https://github.com/thelounge/thelounge/pull/1261) by [@xPaw](https://github.com/xPaw))
-- Fix MOTD underline in Safari ([#1217](https://github.com/thelounge/thelounge/pull/1217) by [@MaxLeiter](https://github.com/MaxLeiter))
-
-### Documentation
-
-In the main repository:
-
-- Clarify kilobyte ambiguity ([#1248](https://github.com/thelounge/thelounge/pull/1248) by [@xPaw](https://github.com/xPaw))
-- Fix stray end tag ([#1251](https://github.com/thelounge/thelounge/pull/1251) by [@xPaw](https://github.com/xPaw))
-
-### Internals
-
-- Update to ESLint 4 and enforce extra rules ([#1231](https://github.com/thelounge/thelounge/pull/1231) by [@xPaw](https://github.com/xPaw))
-- Improve the PR tester script a bit ([#1240](https://github.com/thelounge/thelounge/pull/1240) by [@astorije](https://github.com/astorije))
-- Add modules for socket events ([#1175](https://github.com/thelounge/thelounge/pull/1175) by [@YaManicKill](https://github.com/YaManicKill))
-- Ignore `package-lock.json` ([#1247](https://github.com/thelounge/thelounge/pull/1247) by [@xPaw](https://github.com/xPaw))
-- Use `stylelint-config-standard` ([#1249](https://github.com/thelounge/thelounge/pull/1249) by [@xPaw](https://github.com/xPaw))
-- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `babel-core` ([#1212](https://github.com/thelounge/thelounge/pull/1212))
- - `babel-loader` ([#1245](https://github.com/thelounge/thelounge/pull/1245))
- - `nyc` ([#1198](https://github.com/thelounge/thelounge/pull/1198))
- - `stylelint` ([#1215](https://github.com/thelounge/thelounge/pull/1215), [#1230](https://github.com/thelounge/thelounge/pull/1230))
- - `chai` ([#1206](https://github.com/thelounge/thelounge/pull/1206))
- - `webpack` ([#1238](https://github.com/thelounge/thelounge/pull/1238))
-
-## v2.3.1 - 2017-06-09
-
-For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.3.0...v2.3.1) and [milestone](https://github.com/thelounge/thelounge/milestone/23?closed=1).
-
-This release mostly fixes a few bugs, as listed below.
-
-### Changed
-
-- Keep original `` name when changing the title ([#1205](https://github.com/thelounge/thelounge/pull/1205) by [@xPaw](https://github.com/xPaw))
-- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `handlebars` ([#1179](https://github.com/thelounge/thelounge/pull/1179))
-
-### Fixed
-
-- Do not store unnecessary information in user objects ([#1195](https://github.com/thelounge/thelounge/pull/1195) by [@xPaw](https://github.com/xPaw))
-- Correctly configure client socket transports ([#1197](https://github.com/thelounge/thelounge/pull/1197) by [@xPaw](https://github.com/xPaw))
-- Fix network name not being set when `displayNetwork` is `false` ([#1211](https://github.com/thelounge/thelounge/pull/1211) by [@xPaw](https://github.com/xPaw))
-
-### Security
-
-- Do not store passwords in settings storage ([#1204](https://github.com/thelounge/thelounge/pull/1204) by [@xPaw](https://github.com/xPaw))
-
-### Internals
-
-- Fix `localtime` test to correctly use UTC ([#1201](https://github.com/thelounge/thelounge/pull/1201) by [@xPaw](https://github.com/xPaw))
-- Update Node.js versions for Travis CI ([#1191](https://github.com/thelounge/thelounge/pull/1191) by [@YaManicKill](https://github.com/YaManicKill))
-- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `mocha` ([#1170](https://github.com/thelounge/thelounge/pull/1170))
- - `webpack` ([#1183](https://github.com/thelounge/thelounge/pull/1183))
- - `babel-preset-env` ([#1177](https://github.com/thelounge/thelounge/pull/1177))
-
-## v2.3.0 - 2017-06-08
-
-For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.2.2...v2.3.0) and [milestone](https://github.com/thelounge/thelounge/milestone/9?closed=1).
-
-What a release! Our biggest one since the v2.0.0 [release](https://github.com/thelounge/thelounge/releases/tag/v2.0.0) / [milestone](https://github.com/thelounge/thelounge/milestone/1?closed=1)!
-Expect a lot of new cool stuff, tons of bug fixes and performance improvements.
-Thanks to all 16 contributors (!!) who pitched in for this release, open source at its finest!
-
-On the server side, The Lounge now supports an auto-away mechanism, stores channel keys across restarts and key changes, and supports a new SSL CA bundle option in the configuration file.
-
-Users of the client will notice some changes as well:
-
-- A bunch of new hotkeys to style messages (bold, italic, underline, foreground/background color), all listed in the Help window
-
-- A new autocomplete mechanism for emoji, users, channels, commands, and colors:
-
-
-
- Note that due to the new nick autocomplete, we removed the now unnecessary nick cycle button that was temporarily added in the meantime. Lots of users have reported it had been broken by a previous release anyway.
-
-- Support of page up/down keys to browse the current chat
-
-- Friendliness-bump of time-related tooltips and date marker:
-
-  
-
-- Support of browsers' Back/Forward actions:
-
-
-
-- Better and more discreet inline previews for links and images:
-
-
-
-
-- Improved channel list with `/list`
-
-- Support for `/ban`, `/unban` and `/banlist`
-
-- Fuzzy-matching of the user list search to find folks more easily:
-
- 
-
-That's all for this release, and onto the next one now!
-
-### Added
-
-- Add `data-from` attribute to allow styling messages from specific users ([#978](https://github.com/thelounge/thelounge/pull/978) by [@williamboman](https://github.com/williamboman))
-- Auto away when no clients are connected ([#775](https://github.com/thelounge/thelounge/pull/775), [#1104](https://github.com/thelounge/thelounge/pull/1104) by [@xPaw](https://github.com/xPaw))
-- Implement color hotkeys ([#810](https://github.com/thelounge/thelounge/pull/810) by [@xPaw](https://github.com/xPaw))
-- Store channel keys ([#1003](https://github.com/thelounge/thelounge/pull/1003) by [@xPaw](https://github.com/xPaw), [#715](https://github.com/thelounge/thelounge/pull/715) by [@spookhurb](https://github.com/spookhurb))
-- Implement pgup /pgdown keys ([#955](https://github.com/thelounge/thelounge/pull/955) by [@xPaw](https://github.com/xPaw), [#1078](https://github.com/thelounge/thelounge/pull/1078) by [@YaManicKill](https://github.com/YaManicKill))
-- Add CSS tooltips on time elements to give ability to view time on mobile ([#824](https://github.com/thelounge/thelounge/pull/824) by [@xPaw](https://github.com/xPaw))
-- Add SSL CA bundle option ([#1024](https://github.com/thelounge/thelounge/pull/1024) by [@metsjeesus](https://github.com/metsjeesus))
-- Implement History Web API ([#575](https://github.com/thelounge/thelounge/pull/575) by [@williamboman](https://github.com/williamboman), [#1080](https://github.com/thelounge/thelounge/pull/1080) by [@YaManicKill](https://github.com/YaManicKill))
-- Add slug with command to unhandled messages ([#816](https://github.com/thelounge/thelounge/pull/816) by [@DanielOaks](https://github.com/DanielOaks), [#1044](https://github.com/thelounge/thelounge/pull/1044) by [@YaManicKill](https://github.com/YaManicKill))
-- Add support for the `/banlist` command ([#1009](https://github.com/thelounge/thelounge/pull/1009) by [@YaManicKill](https://github.com/YaManicKill))
-- Add support for `/ban` and `/unban` commands ([#1077](https://github.com/thelounge/thelounge/pull/1077) by [@YaManicKill](https://github.com/YaManicKill))
-- Add autocompletion for emoji, users, channels, and commands ([#787](https://github.com/thelounge/thelounge/pull/787) by [@yashsriv](https://github.com/yashsriv), [#1138](https://github.com/thelounge/thelounge/pull/1138), [#1095](https://github.com/thelounge/thelounge/pull/1095) by [@xPaw](https://github.com/xPaw))
-- Add autocomplete strategy for foreground and background colors ([#1109](https://github.com/thelounge/thelounge/pull/1109) by [@astorije](https://github.com/astorije))
-- Add support for `0x04` hex colors ([#1100](https://github.com/thelounge/thelounge/pull/1100) by [@xPaw](https://github.com/xPaw))
-
-### Changed
-
-- Remove table layout for chat messages (and fix layout issues yet again) ([#523](https://github.com/thelounge/thelounge/pull/523) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Improve inline previews for links and images ([#524](https://github.com/thelounge/thelounge/pull/524) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Use local variables to check length ([#1028](https://github.com/thelounge/thelounge/pull/1028) by [@xPaw](https://github.com/xPaw))
-- Add `rel="noopener"` to URLs in `index.html` and replace mIRC colors URL to [@DanielOaks](https://github.com/DanielOaks)'s [documentation](https://modern.ircdocs.horse/formatting.html#colors) ([#1034](https://github.com/thelounge/thelounge/pull/1034) by [@xPaw](https://github.com/xPaw), [#1051](https://github.com/thelounge/thelounge/pull/1051) by [@astorije](https://github.com/astorije))
-- Preload scripts as soon as possible ([#1033](https://github.com/thelounge/thelounge/pull/1033) by [@xPaw](https://github.com/xPaw))
-- Improve channels list ([#1018](https://github.com/thelounge/thelounge/pull/1018) by [@swordbeta](https://github.com/swordbeta))
-- Show MOTD by default ([#1052](https://github.com/thelounge/thelounge/pull/1052) by [@KlipperKyle](https://github.com/KlipperKyle), [#1157](https://github.com/thelounge/thelounge/pull/1157) by [@astorije](https://github.com/astorije))
-- Switch to a new IRC message parser ([#972](https://github.com/thelounge/thelounge/pull/972) by [@xPaw](https://github.com/xPaw), [#699](https://github.com/thelounge/thelounge/pull/699) by [@Bonuspunkt](https://github.com/Bonuspunkt))
-- Use moment on the client to display friendly dates ([#1054](https://github.com/thelounge/thelounge/pull/1054) by [@astorije](https://github.com/astorije))
-- Implement fuzzy-matching for the user list ([#856](https://github.com/thelounge/thelounge/pull/856), [#1093](https://github.com/thelounge/thelounge/pull/1093), [#1167](https://github.com/thelounge/thelounge/pull/1167) by [@astorije](https://github.com/astorije), [#1091](https://github.com/thelounge/thelounge/pull/1091) by [@PolarizedIons](https://github.com/PolarizedIons), [#1107](https://github.com/thelounge/thelounge/pull/1107) by [@xPaw](https://github.com/xPaw))
-- Use moment to render dates everywhere ([#1114](https://github.com/thelounge/thelounge/pull/1114) by [@xPaw](https://github.com/xPaw))
-- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `moment` ([#976](https://github.com/thelounge/thelounge/pull/976), [#999](https://github.com/thelounge/thelounge/pull/999))
- - `fs-extra` ([#964](https://github.com/thelounge/thelounge/pull/964), [#1098](https://github.com/thelounge/thelounge/pull/1098), [#1136](https://github.com/thelounge/thelounge/pull/1136))
- - `jquery` ([#969](https://github.com/thelounge/thelounge/pull/969), [#998](https://github.com/thelounge/thelounge/pull/998))
- - `urijs` ([#995](https://github.com/thelounge/thelounge/pull/995))
- - `mousetrap` ([#1006](https://github.com/thelounge/thelounge/pull/1006))
- - `irc-framework` ([#1070](https://github.com/thelounge/thelounge/pull/1070), [#1074](https://github.com/thelounge/thelounge/pull/1074), [#1123](https://github.com/thelounge/thelounge/pull/1123))
- - `handlebars` ([#1116](https://github.com/thelounge/thelounge/pull/1116), [#1129](https://github.com/thelounge/thelounge/pull/1129))
-
-### Removed
-
-- Remove invalid CSS perspective properties ([#1027](https://github.com/thelounge/thelounge/pull/1027) by [@astorije](https://github.com/astorije))
-- Remove cycle nicks button ([#1062](https://github.com/thelounge/thelounge/pull/1062) by [@xPaw](https://github.com/xPaw))
-
-### Fixed
-
-- Rewrite identd server, combine with oidentd ([#804](https://github.com/thelounge/thelounge/pull/804), [#970](https://github.com/thelounge/thelounge/pull/970) by [@xPaw](https://github.com/xPaw))
-- Fix wrong font size in help center labels ([#994](https://github.com/thelounge/thelounge/pull/994) by [@astorije](https://github.com/astorije))
-- Fix filling in the nickname, overriding the username in the New Network window ([#873](https://github.com/thelounge/thelounge/pull/873) by [@PolarizedIons](https://github.com/PolarizedIons))
-- Correctly append date marker when receiving a message ([#1002](https://github.com/thelounge/thelounge/pull/1002) by [@xPaw](https://github.com/xPaw))
-- Count only message items for when loading more messages ([#1013](https://github.com/thelounge/thelounge/pull/1013) by [@awalgarg](https://github.com/awalgarg))
-- Fix Zenburn and Morning channel list font color ([#1017](https://github.com/thelounge/thelounge/pull/1017) by [@swordbeta](https://github.com/swordbeta))
-- Stick to bottom when opening user list ([#1032](https://github.com/thelounge/thelounge/pull/1032) by [@xPaw](https://github.com/xPaw))
-- Reset notification markers on document focus ([#1040](https://github.com/thelounge/thelounge/pull/1040) by [@xPaw](https://github.com/xPaw))
-- Disable show more button when loading messages ([#1045](https://github.com/thelounge/thelounge/pull/1045) by [@YaManicKill](https://github.com/YaManicKill))
-- Fix to `helper.expandhome` to correctly resolve `""` and `undefined` ([#1050](https://github.com/thelounge/thelounge/pull/1050) by [@metsjeesus](https://github.com/metsjeesus))
-- Fix displayNetwork to work correctly ([#1069](https://github.com/thelounge/thelounge/pull/1069) by [@xPaw](https://github.com/xPaw))
-- Enable show more button correctly ([#1068](https://github.com/thelounge/thelounge/pull/1068) by [@xPaw](https://github.com/xPaw))
-- Rewrite server code of channel sorting ([#1064](https://github.com/thelounge/thelounge/pull/1064) by [@xPaw](https://github.com/xPaw) and ([#1115](https://github.com/thelounge/thelounge/pull/1115) by [@PolarizedIons](https://github.com/PolarizedIons)))
-- Fix showing prefetch options ([#1087](https://github.com/thelounge/thelounge/pull/1087) by [@YaManicKill](https://github.com/YaManicKill))
-- Add `/ctcp` command to constants and auto-completion ([#1108](https://github.com/thelounge/thelounge/pull/1108) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Disable `tabindex` on user list search input ([#1122](https://github.com/thelounge/thelounge/pull/1122) by [@xPaw](https://github.com/xPaw))
-- Fix date-marker not being removed on loading new messages ([#1132](https://github.com/thelounge/thelounge/pull/1132), [#1156](https://github.com/thelounge/thelounge/pull/1156) by [@PolarizedIons](https://github.com/PolarizedIons))
-
-### Security
-
-- Switch to `bcryptjs` and make password comparison asynchronous ([#985](https://github.com/thelounge/thelounge/pull/985) by [@rockhouse](https://github.com/rockhouse), [`b46f92c`](https://github.com/thelounge/thelounge/commit/b46f92c7d8a07e84f49a550b32204c0a0672e831) by [@xPaw](https://github.com/xPaw))
-- Use Referrer-Policy header instead of CSP referrer ([#1015](https://github.com/thelounge/thelounge/pull/1015) by [@astorije](https://github.com/astorije))
-
-### Internals
-
-- Enforce more space and new line rules ([#975](https://github.com/thelounge/thelounge/pull/975) by [@xPaw](https://github.com/xPaw))
-- Setup ESLint to make sure an EOF feed is always present ([#991](https://github.com/thelounge/thelounge/pull/991) by [@astorije](https://github.com/astorije))
-- Do not build json3 module with Webpack ([#977](https://github.com/thelounge/thelounge/pull/977) by [@xPaw](https://github.com/xPaw))
-- Remove extra newline to please ESLint ([#997](https://github.com/thelounge/thelounge/pull/997) by [@astorije](https://github.com/astorije))
-- Use `require()` instead of import in client code ([#973](https://github.com/thelounge/thelounge/pull/973) by [@xPaw](https://github.com/xPaw))
-- Do not build feature branch with open pull requests on AppVeyor ([`934400f`](https://github.com/thelounge/thelounge/commit/934400f5ee094e61c62dd0304cb55ea9f9666078) by [@xPaw](https://github.com/xPaw))
-- Exclude Webpack config from coverage report ([#1053](https://github.com/thelounge/thelounge/pull/1053) by [@astorije](https://github.com/astorije))
-- Create socket module ([#1060](https://github.com/thelounge/thelounge/pull/1060) by [@YaManicKill](https://github.com/YaManicKill))
-- Change index.html to be rendered using handlebars ([#1057](https://github.com/thelounge/thelounge/pull/1057) by [@YaManicKill](https://github.com/YaManicKill))
-- Move commands into constants module ([#1067](https://github.com/thelounge/thelounge/pull/1067) by [@YaManicKill](https://github.com/YaManicKill))
-- Use `babel-preset-env` ([#1072](https://github.com/thelounge/thelounge/pull/1072) by [@xPaw](https://github.com/xPaw))
-- Use `irc-framework`'s `setTopic()` for topic command ([#1082](https://github.com/thelounge/thelounge/pull/1082) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Create options module ([#1066](https://github.com/thelounge/thelounge/pull/1066) by [@YaManicKill](https://github.com/YaManicKill))
-- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `babel-core` ([#958](https://github.com/thelounge/thelounge/pull/958), [#1021](https://github.com/thelounge/thelounge/pull/1021))
- - `babel-loader` ([#968](https://github.com/thelounge/thelounge/pull/968), [#1020](https://github.com/thelounge/thelounge/pull/1020), [#1063](https://github.com/thelounge/thelounge/pull/1063))
- - `babel-preset-es2015` ([#960](https://github.com/thelounge/thelounge/pull/960))
- - `eslint` ([#971](https://github.com/thelounge/thelounge/pull/971), [#1000](https://github.com/thelounge/thelounge/pull/1000))
- - `nyc` ([#989](https://github.com/thelounge/thelounge/pull/989), [#1113](https://github.com/thelounge/thelounge/pull/1113), [#1140](https://github.com/thelounge/thelounge/pull/1140))
- - `webpack` ([#981](https://github.com/thelounge/thelounge/pull/981), [#1007](https://github.com/thelounge/thelounge/pull/1007), [#1030](https://github.com/thelounge/thelounge/pull/1030), [#1133](https://github.com/thelounge/thelounge/pull/1133), [#1142](https://github.com/thelounge/thelounge/pull/1142))
- - `stylelint` ([#1004](https://github.com/thelounge/thelounge/pull/1004), [#1005](https://github.com/thelounge/thelounge/pull/1005))
- - `handlebars-loader` ([#1058](https://github.com/thelounge/thelounge/pull/1058))
- - `mocha` ([#1079](https://github.com/thelounge/thelounge/pull/1079))
-
-## v2.3.0-rc.2 - 2017-05-16 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.3.0-rc.1...v2.3.0-rc.2)
-
-This is a release candidate for v2.3.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.3.0-rc.1 - 2017-05-07 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.2.2...v2.3.0-rc.1)
-
-This is a release candidate for v2.3.0 to ensure maximum stability for public release.
-Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
-
-As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
-
-```sh
-npm install -g thelounge@next
-```
-
-## v2.2.2 - 2017-03-13
-
-For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.2.1...v2.2.2) and [milestone](https://github.com/thelounge/thelounge/milestone/11?closed=1).
-
-This patch release brings a lot of dependency upgrades and a few fixes. Passing options to the `lounge` CLI (`lounge start --port 8080`, etc.) now works as expected without requiring `--`. We have also disabled ping timeouts for now to hopefully fix automatic reconnection. Finally, upgrading `irc-framework` allows us to fix an extra couple of bugs.
-
-You will now notice a new `(?)` icon at the bottom of the sidebar. It is home of a help center that currently details supported shortcuts and commands. It will be improved over time, but we encourage contributors to help us improve it.
-
-Note that as of this release, `lounge` without any arguments wil display the help information (mirroring `lounge --help`). Prior to this release, it used to start a server, which must now be done explicitly using `lounge start`.
-
-### Changed
-
-- Update to `jQuery` 3 ([#931](https://github.com/thelounge/thelounge/pull/931) by [@xPaw](https://github.com/xPaw))
-- Update `express` and `nyc` to latest versions ([#954](https://github.com/thelounge/thelounge/pull/954) by [@xPaw](https://github.com/xPaw))
-- Update production dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `mousetrap` ([#881](https://github.com/thelounge/thelounge/pull/881))
- - `fs-extra` ([#878](https://github.com/thelounge/thelounge/pull/878))
- - `irc-framework` ([#918](https://github.com/thelounge/thelounge/pull/918) and [#952](https://github.com/thelounge/thelounge/pull/952))
- - `urijs` ([#921](https://github.com/thelounge/thelounge/pull/921), [#940](https://github.com/thelounge/thelounge/pull/940) and [#946](https://github.com/thelounge/thelounge/pull/946))
- - `socket.io` and `socket.io-client` ([#926](https://github.com/thelounge/thelounge/pull/926))
- - `request` ([#944](https://github.com/thelounge/thelounge/pull/944))
-
-### Fixed
-
-- Disable (temporarily) client ping timeouts ([#939](https://github.com/thelounge/thelounge/pull/939) by [@xPaw](https://github.com/xPaw))
-- Update arg parsing and default `lounge` to `lounge --help` ([#929](https://github.com/thelounge/thelounge/pull/929) by [@msaun008](https://github.com/msaun008))
-- Prevent message sending in lobbies ([#957](https://github.com/thelounge/thelounge/pull/957) by [@xPaw](https://github.com/xPaw))
-
-### Documentation
-
-In the main repository:
-
-- Help window with supported commands and shortcuts ([#941](https://github.com/thelounge/thelounge/pull/941) by [@astorije](https://github.com/astorije))
-
-On the website:
-
-- Add notes about moving client docs to the app itself ([#63](https://github.com/thelounge/thelounge.chat/pull/63) by [@astorije](https://github.com/astorije))
-- Deprecate (and attempt one last fixing) documentations of Heroku and Passenger ([#61](https://github.com/thelounge/thelounge.chat/pull/61) by [@astorije](https://github.com/astorije))
-
-### Internals
-
-- Fix `run_pr.sh` script ([#919](https://github.com/thelounge/thelounge/pull/919) by [@astorije](https://github.com/astorije))
-- Make sure multiline chains of calls are correctly indented ([#930](https://github.com/thelounge/thelounge/pull/930) by [@astorije](https://github.com/astorije))
-- Update development dependencies to their latest versions, by [Greenkeeper](https://greenkeeper.io/) 🚀:
- - `babel-core`, `babel-loader` and `babel-preset-es2015` ([#922](https://github.com/thelounge/thelounge/pull/922) and [#947](https://github.com/thelounge/thelounge/pull/947))
- - `webpack` ([#905](https://github.com/thelounge/thelounge/pull/905))
- - `stylelint` ([#934](https://github.com/thelounge/thelounge/pull/934))
- - `npm-run-all` ([#938](https://github.com/thelounge/thelounge/pull/938))
- - `eslint` ([#937](https://github.com/thelounge/thelounge/pull/937) and [#943](https://github.com/thelounge/thelounge/pull/943))
-
-## v2.2.1 - 2017-02-12
-
-For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.2.0...v2.2.1) and [milestone](https://github.com/thelounge/thelounge/milestone/10?closed=1).
-
-This patch release packs up a change of the default value of `maxHistory`, an interactive prompt when creating a user to enable/disable user logging, a UI bug fix, and a few dependency upgrades.
-
-### Changed
-
-- Change default `maxHistory` to 10000 ([#899](https://github.com/thelounge/thelounge/pull/899) by [@xPaw](https://github.com/xPaw))
-- Prompt admin for user log at user creation ([#903](https://github.com/thelounge/thelounge/pull/903) by [@astorije](https://github.com/astorije))
-- Update `irc-framework` to the latest version 🚀 ([#902](https://github.com/thelounge/thelounge/pull/902) by [Greenkeeper](https://greenkeeper.io/))
-- Update `urijs` to the latest version 🚀 ([#904](https://github.com/thelounge/thelounge/pull/904) by [Greenkeeper](https://greenkeeper.io/))
-- Update `express` to the latest version 🚀 ([#898](https://github.com/thelounge/thelounge/pull/898) by [Greenkeeper](https://greenkeeper.io/))
-
-### Fixed
-
-- Fix body height, regression from v2.2.0 ([#913](https://github.com/thelounge/thelounge/pull/913) by [@YaManicKill](https://github.com/YaManicKill))
-
-### Documentation
-
-In the main repository:
-
-- Explain about `lounge` command in dev installations ([#887](https://github.com/thelounge/thelounge/pull/887) by [@drkitty](https://github.com/drkitty))
-
-On the website:
-
-- Port recent changes to `maxHistory` from default config file ([#60](https://github.com/thelounge/thelounge.chat/pull/60) by [@astorije](https://github.com/astorije))
-
-### Internals
-
-- Sort depedencies in `package.json` ([#896](https://github.com/thelounge/thelounge/pull/896) by [@xPaw](https://github.com/xPaw))
-- Update `nyc` to the latest version 🚀 ([#882](https://github.com/thelounge/thelounge/pull/882) by [Greenkeeper](https://greenkeeper.io/))
-- Update `npm-run-all` to the latest version 🚀 ([#880](https://github.com/thelounge/thelounge/pull/880) by [Greenkeeper](https://greenkeeper.io/))
-- Add nyc and Webpack config files to the files ignored when releasing ([#906](https://github.com/thelounge/thelounge/pull/906) by [@astorije](https://github.com/astorije))
-- Update `stylelint` to the latest version 🚀 ([#907](https://github.com/thelounge/thelounge/pull/907) by [Greenkeeper](https://greenkeeper.io/))
-- Update `eslint` to the latest version 🚀 ([#910](https://github.com/thelounge/thelounge/pull/910) by [Greenkeeper](https://greenkeeper.io/))
-
-## v2.2.0 - 2017-01-31
-
-For more details, [see the full changelog](https://github.com/thelounge/thelounge/compare/v2.1.0...v2.2.0) and [milestone](https://github.com/thelounge/thelounge/milestone/2?closed=1).
-
-Another long-overdue release for The Lounge!
-
-On the client, it is now possible to generate URLs that pre-fill connection inputs in public mode, a date separator makes it into the chats, `/away` and `/back` commands are now supported, idle time gets displayed on `/whois`.
-Also, the client does not abruptly refresh when connection is lost anymore, and user search has been slightly improved. Note however that these last 2 items are still not optimal, but improvements are underway!
-
-On the server, more logging! The `debug` option is now an object instead of a boolean, so make sure to update your configuration file accordingly. More details [here](https://github.com/thelounge/thelounge/blob/v2.2.0/defaults/config.js#L364-L383).
-There are changes revolving around user configuration autoloading: it has been greatly improved and therefore it is now enabled by default. Make sure to remove the `autoload` option from your configuration files.
-
-And of course, tons of fixes and less noticeable feature additions and changes, so make sure to check the full list below!
-
-### Added
-
-- Override network connection inputs with URL parameters ([#674](https://github.com/thelounge/thelounge/pull/674) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Add `id` to submit button ([#717](https://github.com/thelounge/thelounge/pull/717) by [@xPaw](https://github.com/xPaw))
-- Add a UI element to cycle through nick completions on mobile ([#708](https://github.com/thelounge/thelounge/pull/708) by [@astorije](https://github.com/astorije))
-- Report configuration file path, Node.js version and OS platform on server start-up ([#736](https://github.com/thelounge/thelounge/pull/736) by [@williamboman](https://github.com/williamboman) and [#743](https://github.com/thelounge/thelounge/pull/743) by [@xPaw](https://github.com/xPaw))
-- Add `lounge` keyword to npm registry ([#747](https://github.com/thelounge/thelounge/pull/747) by [@xPaw](https://github.com/xPaw))
-- Add a date separator to channels/PMs ([#671](https://github.com/thelounge/thelounge/pull/671) and [#765](https://github.com/thelounge/thelounge/pull/765) by [@PolarizedIons](https://github.com/PolarizedIons))
-- Add support for hexip ilines and fix storing client IP address in configuration file ([#749](https://github.com/thelounge/thelounge/pull/749) and [#822](https://github.com/thelounge/thelounge/pull/822) by [@xPaw](https://github.com/xPaw))
-- Implement `/away` and `/back` commands ([#745](https://github.com/thelounge/thelounge/pull/745) by [@xPaw](https://github.com/xPaw))
-- Remind channel name or nick in input placeholder ([#832](https://github.com/thelounge/thelounge/pull/832) and [#889](https://github.com/thelounge/thelounge/pull/889) by [@astorije](https://github.com/astorije))
-- Add human-readable idle time in whois info ([#721](https://github.com/thelounge/thelounge/pull/721) by [@astorije](https://github.com/astorije))
-- Option to log raw IRC traffic ([#783](https://github.com/thelounge/thelounge/pull/783) by [@astorije](https://github.com/astorije))
-
-### Changed
-
-- Improve support for opening multiple clients at once ([#636](https://github.com/thelounge/thelounge/pull/636) by [@xPaw](https://github.com/xPaw))
-- Match window title border line to text color ([#716](https://github.com/thelounge/thelounge/pull/716) by [@xPaw](https://github.com/xPaw))
-- Focus input after chat form submit ([#483](https://github.com/thelounge/thelounge/pull/483) by [@williamboman](https://github.com/williamboman))
-- Refactor user autoload to use `fs.watch` and make it more transparent in the app ([#751](https://github.com/thelounge/thelounge/pull/751) by [@xPaw](https://github.com/xPaw) and [#779](https://github.com/thelounge/thelounge/pull/779) by [@astorije](https://github.com/astorije))
-- Sync reordering of channels/networks to other clients in real-time ([#757](https://github.com/thelounge/thelounge/pull/757) by [@PolarizedIons](https://github.com/PolarizedIons))
-- Do not accept empty password when adding new user ([#795](https://github.com/thelounge/thelounge/pull/795) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Stop refreshing the page on every socket.io error ([#784](https://github.com/thelounge/thelounge/pull/784) by [@xPaw](https://github.com/xPaw))
-- Only append "says" to notifications if it is a message ([#805](https://github.com/thelounge/thelounge/pull/805) by [@xPaw](https://github.com/xPaw))
-- Allow user search to find a pattern anywhere in the nicks ([#855](https://github.com/thelounge/thelounge/pull/855) by [@MaxLeiter](https://github.com/MaxLeiter))
-
-### Removed
-
-- Remove browser notification polyfill and inform user when unsupported ([#709](https://github.com/thelounge/thelounge/pull/709) by [@astorije](https://github.com/astorije))
-- Remove erroneous classname from password field ([#748](https://github.com/thelounge/thelounge/pull/748) by [@xPaw](https://github.com/xPaw))
-- Do not dismiss native web notifications programmatically after 5s ([#739](https://github.com/thelounge/thelounge/pull/739) by [@williamboman](https://github.com/williamboman))
-
-### Fixed
-
-- Fix `/mode` command to correctly assume target ([#679](https://github.com/thelounge/thelounge/pull/679) by [@xPaw](https://github.com/xPaw))
-- Fix crash when LDAP server is unreachable ([#697](https://github.com/thelounge/thelounge/pull/697) by [@gramakri](https://github.com/gramakri))
-- Fix channels behaving strangely while dragging ([#697](https://github.com/thelounge/thelounge/pull/697) by [@PolarizedIons](https://github.com/PolarizedIons))
-- Fix unread counters resetting when they should not ([#720](https://github.com/thelounge/thelounge/pull/720) by [@PolarizedIons](https://github.com/PolarizedIons))
-- Silence failures to trigger notifications when not available ([#732](https://github.com/thelounge/thelounge/pull/732) by [@astorije](https://github.com/astorije))
-- Avoid unnecessary disk writes when saving user ([#750](https://github.com/thelounge/thelounge/pull/750) by [@xPaw](https://github.com/xPaw))
-- Use correct channel when pushing link prefetch messages ([#782](https://github.com/thelounge/thelounge/pull/782) by [@xPaw](https://github.com/xPaw))
-- Correctly remove closed sockets from oident file, remove unused functions ([#753](https://github.com/thelounge/thelounge/pull/753) by [@xPaw](https://github.com/xPaw))
-- Do not automatically focus on touch devices ([#801](https://github.com/thelounge/thelounge/pull/801) by [@xPaw](https://github.com/xPaw))
-- Strip control characters from notifications ([#818](https://github.com/thelounge/thelounge/pull/818) by [@xPaw](https://github.com/xPaw))
-- Improve CLI a bit (output formatting and subcommand/option bug fix) ([#799](https://github.com/thelounge/thelounge/pull/799) and [#868](https://github.com/thelounge/thelounge/pull/868) by [@astorije](https://github.com/astorije))
-- Make HTML container take the entire screen estate ([#821](https://github.com/thelounge/thelounge/pull/821) by [@xPaw](https://github.com/xPaw))
-- Fix unread marker being removed from DOM ([#820](https://github.com/thelounge/thelounge/pull/820) by [@xPaw](https://github.com/xPaw))
-- Remove margin on date marker on smallest screen size ([#830](https://github.com/thelounge/thelounge/pull/830) by [@xPaw](https://github.com/xPaw))
-- Do not ignore window opens when considering active channels ([#834](https://github.com/thelounge/thelounge/pull/834) by [@xPaw](https://github.com/xPaw))
-- Calculate menu width on touch start ([#836](https://github.com/thelounge/thelounge/pull/836) by [@xPaw](https://github.com/xPaw))
-- Increase IRC colors contrast ([#829](https://github.com/thelounge/thelounge/pull/829) by [@xPaw](https://github.com/xPaw))
-- Do not prefetch URLs unless they are messages or `/me` actions ([#812](https://github.com/thelounge/thelounge/pull/812) by [@birkof](https://github.com/birkof))
-- Bump `irc-framework` to bring a couple of fixes ([#790](https://github.com/thelounge/thelounge/pull/790) by [@astorije](https://github.com/astorije), [#802](https://github.com/thelounge/thelounge/pull/802) by [@xPaw](https://github.com/xPaw) and [#852](https://github.com/thelounge/thelounge/pull/852) by [Greenkeeper](https://greenkeeper.io/))
-
-### Security
-
-- Change bcrypt rounds from 8 to 11 ([#711](https://github.com/thelounge/thelounge/pull/711) by [@xPaw](https://github.com/xPaw))
-
-### Documentation
-
-In the main repository:
-
-- Warn against running from source as root in README ([#725](https://github.com/thelounge/thelounge/pull/725) by [@astorije](https://github.com/astorije))
-- Add screenshot to README ([#694](https://github.com/thelounge/thelounge/pull/694) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Simplify introduction on README ([#789](https://github.com/thelounge/thelounge/pull/789) by [@astorije](https://github.com/astorije))
-
-On the website:
-
-- Remove distribution-specific install instructions of Node.js ([#49](https://github.com/thelounge/thelounge.chat/pull/49) by [@astorije](https://github.com/astorije))
-- Remove wrong information about setting up password along with creating a user ([#50](https://github.com/thelounge/thelounge.chat/pull/50) by [@astorije](https://github.com/astorije))
-- Update documentation of the configuration file ([#43](https://github.com/thelounge/thelounge.chat/pull/43) by [@daftaupe](https://github.com/daftaupe))
-- Document the `/away` and `/back` commands ([#59](https://github.com/thelounge/thelounge.chat/pull/59) by [@drkitty](https://github.com/drkitty))
-
-### Internals
-
-- Fix AppVeyor cache never being successfully built and unblock AppVeyor ([#700](https://github.com/thelounge/thelounge/pull/700) by [@astorije](https://github.com/astorije) and [#755](https://github.com/thelounge/thelounge/pull/755) by [@IlyaFinkelshteyn](https://github.com/IlyaFinkelshteyn))
-- Add a simple (first) test for `localetime` Handlebars helper ([#703](https://github.com/thelounge/thelounge/pull/703) by [@astorije](https://github.com/astorije))
-- Get rid of OSX CI builds until they get much faster ([#707](https://github.com/thelounge/thelounge/pull/707) by [@astorije](https://github.com/astorije))
-- Update badges in README ([#713](https://github.com/thelounge/thelounge/pull/713) by [@xPaw](https://github.com/xPaw) and [#780](https://github.com/thelounge/thelounge/pull/780) by [@astorije](https://github.com/astorije))
-- Add Node.js v7, current stable, to Travis CI ([#800](https://github.com/thelounge/thelounge/pull/800) by [@astorije](https://github.com/astorije))
-- Use Webpack to build our client code and dependencies ([#640](https://github.com/thelounge/thelounge/pull/640) by [@nornagon](https://github.com/nornagon) and [#817](https://github.com/thelounge/thelounge/pull/817) by [@xPaw](https://github.com/xPaw))
-- Switch `istanbul` code coverage CLI to more recent `nyc` one ([#850](https://github.com/thelounge/thelounge/pull/850) by [@astorije](https://github.com/astorije))
-- Add web server tests ([#838](https://github.com/thelounge/thelounge/pull/838) by [@xPaw](https://github.com/xPaw))
-- Fix stuff that breaks in jQuery 3 ([#854](https://github.com/thelounge/thelounge/pull/854) by [@xPaw](https://github.com/xPaw))
-- Do not uglify builds when running start-dev ([#858](https://github.com/thelounge/thelounge/pull/858) by [@xPaw](https://github.com/xPaw))
-- Update dependencies to latest stable versions ([#746](https://github.com/thelounge/thelounge/pull/746) by [@xPaw](https://github.com/xPaw))
-- Update dependencies to enable Greenkeeper 🌴 ([#826](https://github.com/thelounge/thelounge/pull/826) by [Greenkeeper](https://greenkeeper.io/))
-- Update `lodash` to the latest version 🚀 ([#840](https://github.com/thelounge/thelounge/pull/840) and [#862](https://github.com/thelounge/thelounge/pull/862) by [Greenkeeper](https://greenkeeper.io/))
-- Update `stylelint` to the latest version 🚀 ([#861](https://github.com/thelounge/thelounge/pull/861) by [Greenkeeper](https://greenkeeper.io/))
-- Update `npm-run-all` to the latest version 🚀 ([#860](https://github.com/thelounge/thelounge/pull/860) by [Greenkeeper](https://greenkeeper.io/))
-- Update `eslint` to the latest version 🚀 ([#875](https://github.com/thelounge/thelounge/pull/875) by [Greenkeeper](https://greenkeeper.io/))
-- Update `babel-core` to the latest version 🚀 ([#883](https://github.com/thelounge/thelounge/pull/883) by [Greenkeeper](https://greenkeeper.io/))
-
-## v2.1.0 - 2016-10-17
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.1...v2.1.0)
-
-Here comes another release with some nice additions!
-
-While the administrators will notice some bug fixes, most of the changes are client-side: support for `/list`, a slideout menu on mobile, editing one's nick from the UI, wallops message handling.
-
-Enjoy!
-
-### Added
-
-- Implement `/list` ([#258](https://github.com/thelounge/thelounge/pull/258) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Add touch slideout menu for mobile ([#400](https://github.com/thelounge/thelounge/pull/400) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Display extra steps when loading the app ([#637](https://github.com/thelounge/thelounge/pull/637) by [@xPaw](https://github.com/xPaw))
-- Display localized timestamp in title of message times ([#660](https://github.com/thelounge/thelounge/pull/660) by [@astorije](https://github.com/astorije))
-- Changing nick in the UI ([#551](https://github.com/thelounge/thelounge/pull/551) by [@astorije](https://github.com/astorije))
-- Add hostmasks in logs when possible ([#670](https://github.com/thelounge/thelounge/pull/670) by [@astorije](https://github.com/astorije))
-- Display wallops in server window ([#658](https://github.com/thelounge/thelounge/pull/658) by [@xPaw](https://github.com/xPaw))
-
-### Changed
-
-- Make use of multi-prefix cap and remove NAMES spam on mode changes ([#632](https://github.com/thelounge/thelounge/pull/632) by [@xPaw](https://github.com/xPaw))
-- Strict mode for all JS files ([#684](https://github.com/thelounge/thelounge/pull/684) by [@astorije](https://github.com/astorije))
-- Enforce more ESLint rules ([#681](https://github.com/thelounge/thelounge/pull/681) by [@xPaw](https://github.com/xPaw))
-- Use CI caches for downloaded files instead of installed ones ([#687](https://github.com/thelounge/thelounge/pull/687) by [@astorije](https://github.com/astorije))
-- Consolidate version numbers throughout all interfaces ([#592](https://github.com/thelounge/thelounge/pull/592) by [@williamboman](https://github.com/williamboman))
-- Replace lodash's each/map with ES5 native forEach/map ([#689](https://github.com/thelounge/thelounge/pull/689) by [@astorije](https://github.com/astorije))
-
-### Removed
-
-- Remove all font files except WOFF ([#682](https://github.com/thelounge/thelounge/pull/682) by [@xPaw](https://github.com/xPaw))
-
-### Fixed
-
-- Themes: Fixed CSS rule selectors for highlight messages ([#652](https://github.com/thelounge/thelounge/pull/652) by [@DamonGant](https://github.com/DamonGant))
-- Fix unhandled message color in default and Crypto themes ([#653](https://github.com/thelounge/thelounge/pull/653) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Check if SSL key and certificate files exist ([#673](https://github.com/thelounge/thelounge/pull/673) by [@toXel](https://github.com/toXel))
-- Fix loading fonts in Microsoft Edge ([#683](https://github.com/thelounge/thelounge/pull/683) by [@xPaw](https://github.com/xPaw))
-- Fill in prefixLookup on network initialization ([#647](https://github.com/thelounge/thelounge/pull/647) by [@nornagon](https://github.com/nornagon))
-- Fix nick changes not being properly reported in the logs ([#685](https://github.com/thelounge/thelounge/pull/685) by [@astorije](https://github.com/astorije))
-- Fix memory and reference shuffling when creating models ([#664](https://github.com/thelounge/thelounge/pull/664) by [@xPaw](https://github.com/xPaw))
-
-## v2.0.1 - 2016-09-28
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0...v2.0.1)
-
-This is a minor house-keeping release with mostly two sets of changes.
-
-First, a few bugs were fixed, including one simply preventing The Lounge to run in Safari's private browsing.
-
-Additionally, the developer experience has been made a tiny bit better, with better documentation, lighter dependencies and simpler theme creation.
-
-### Changed
-
-- Add info on README about how to run from source, how to upgrade ([#621](https://github.com/thelounge/thelounge/pull/621) by [@astorije](https://github.com/astorije))
-- Move uglify invocation into npm scripts and remove grunt ([#628](https://github.com/thelounge/thelounge/pull/628) by [@nornagon](https://github.com/nornagon))
-- Move Shout theme borders to example theme ([#359](https://github.com/thelounge/thelounge/pull/359) by [@xPaw](https://github.com/xPaw))
-- Update developer dependencies ([#639](https://github.com/thelounge/thelounge/pull/639) by [@xPaw](https://github.com/xPaw))
-
-### Fixed
-
-- Remove -ms-transform and add missed -webkit-transform ([#629](https://github.com/thelounge/thelounge/pull/629) by [@xPaw](https://github.com/xPaw))
-- Ensure localStorage cannot fail because of quota or Safari private browsing ([#625](https://github.com/thelounge/thelounge/pull/625) by [@astorije](https://github.com/astorije))
-- Disable pull-to-refresh on mobile that conflicts with scrolling the message list ([#618](https://github.com/thelounge/thelounge/pull/618) by [@astorije](https://github.com/astorije))
-- Handle stderr when using edit or config command ([#622](https://github.com/thelounge/thelounge/pull/622) by [@MaxLeiter](https://github.com/MaxLeiter))
-
-## v2.0.0 - 2016-09-24
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.5.0...v2.0.0)
-
-After more than 5 months in the works, v2.0.0 is finally happening, and it's shipping with lots of new and enhanced features! 🎉
-
-First of all, the backend IRC library is completely different, which was the first step to deciding on a major release.
-This change brings many improvements and fixes, including support for auto-reconnection! This also allows us to easily improve our [IRCv3 compliance](http://ircv3.net/software/clients.html#web-clients).
-
-Main changes on the server include support for WEBIRC, oidentd and LDAP. On the client, users will notice a lot of improvements about reporting unseen activity (notifications, markers, etc.), support for custom highlights, a new loading page, an auto-expanding message input, a theme selector, and more.
-
-Administrators should note that the channel list format in user configuration files has changed. The old format is deprecated, but it will be automatically converted when the server starts (support may or may not be removed later). Additionally, The Lounge now only runs on Node v4 and up.
-
-The above is only a small subset of changes. A more detailed list can be found below.
-The following list features the most noticeable changes only, and more details can be found on all [v2.0.0 pre-releases](https://www.github.com/thelounge/thelounge/releases).
-
-### Added
-
-- Add tooltips on every clickable icons ([#540](https://github.com/thelounge/thelounge/pull/540) by [@astorije](https://github.com/astorije))
-- Add debug config option for `irc-framework` debug log ([#547](https://github.com/thelounge/thelounge/pull/547) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Client-side theme selector ([#568](https://github.com/thelounge/thelounge/pull/568) by [@astorije](https://github.com/astorije))
-- LDAP support ([#477](https://github.com/thelounge/thelounge/pull/477) by [@thisisdarshan](https://github.com/thisisdarshan) and [@lindskogen](https://github.com/lindskogen))
-- Add custom highlights ([#425](https://github.com/thelounge/thelounge/pull/425) by [@YaManicKill](https://github.com/YaManicKill))
-- Add auto-grow textarea support ([#379](https://github.com/thelounge/thelounge/pull/379) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Display unhandled numerics on the client ([#286](https://github.com/thelounge/thelounge/pull/286) by [@xPaw](https://github.com/xPaw))
-- A proper unread marker ([#332](https://github.com/thelounge/thelounge/pull/332) by [@xPaw](https://github.com/xPaw))
-- Add information on the About section of the client ([#497](https://github.com/thelounge/thelounge/pull/497) by [@astorije](https://github.com/astorije))
-- Add a red dot to the mobile menu icon when being notified ([#486](https://github.com/thelounge/thelounge/pull/486) by [@astorije](https://github.com/astorije))
-- Add "The Lounge" label to the landing pages ([#487](https://github.com/thelounge/thelounge/pull/487) by [@astorije](https://github.com/astorije))
-- Display network name on Connect page when network is locked and info is hidden ([#488](https://github.com/thelounge/thelounge/pull/488) by [@astorije](https://github.com/astorije))
-- Display a loading message instead of blank page ([#386](https://github.com/thelounge/thelounge/pull/386) by [@xPaw](https://github.com/xPaw))
-- Fall back to LOUNGE_HOME env variable when using the CLI ([#402](https://github.com/thelounge/thelounge/pull/402) by [@williamboman](https://github.com/williamboman))
-- Enable auto reconnection ([#254](https://github.com/thelounge/thelounge/pull/254) by [@xPaw](https://github.com/xPaw))
-- Add "!" modechar for admin ([#354](https://github.com/thelounge/thelounge/pull/354) by [@omnicons](https://github.com/omnicons))
-- Add support for oidentd spoofing ([#256](https://github.com/thelounge/thelounge/pull/256) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Log enabled capabilities ([#272](https://github.com/thelounge/thelounge/pull/272) by [@xPaw](https://github.com/xPaw))
-- Add support for `~` home folder expansion ([#284](https://github.com/thelounge/thelounge/pull/284) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Document supported node version ([#280](https://github.com/thelounge/thelounge/pull/280) by [@xPaw](https://github.com/xPaw))
-- Implement WEBIRC ([#240](https://github.com/thelounge/thelounge/pull/240) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Add `manifest.json` for nicer mobile experience ([#310](https://github.com/thelounge/thelounge/pull/310) by [@xPaw](https://github.com/xPaw))
-
-### Changed
-
-- Cache loaded config and merge it with defaults ([#387](https://github.com/thelounge/thelounge/pull/387) by [@xPaw](https://github.com/xPaw))
-- Ignore unnecessary files at release time ([#499](https://github.com/thelounge/thelounge/pull/499) by [@astorije](https://github.com/astorije))
-- Improve font icon management, sizing and sharpness ([#493](https://github.com/thelounge/thelounge/pull/493) by [@astorije](https://github.com/astorije))
-- Maintain scroll position after loading previous messages ([#496](https://github.com/thelounge/thelounge/pull/496) by [@davibe](https://github.com/davibe))
-- Perform node version check as soon as possible ([#409](https://github.com/thelounge/thelounge/pull/409) by [@xPaw](https://github.com/xPaw))
-- Prepend http protocol to www. links in chat ([#410](https://github.com/thelounge/thelounge/pull/410) by [@xPaw](https://github.com/xPaw))
-- Change default configuration for `host` to allow OS to decide and use both IPv4 and IPv6 ([#432](https://github.com/thelounge/thelounge/pull/432) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Do not hide timestamps on small viewports ([#376](https://github.com/thelounge/thelounge/pull/376) by [@xPaw](https://github.com/xPaw))
-- Drop `slate-irc`, switch to `irc-framework` ([#167](https://github.com/thelounge/thelounge/pull/167) by [@xPaw](https://github.com/xPaw))
-- Improve sticky scroll ([#262](https://github.com/thelounge/thelounge/pull/262) by [@xPaw](https://github.com/xPaw))
-- Minor wording changes for better clarity ([#305](https://github.com/thelounge/thelounge/pull/305) by [@astorije](https://github.com/astorije))
-- Improve nick highlights ([#327](https://github.com/thelounge/thelounge/pull/327) by [@xPaw](https://github.com/xPaw))
-- CSS classes in themes for nick colors ([#325](https://github.com/thelounge/thelounge/pull/325) by [@astorije](https://github.com/astorije))
-- Replace all concatenated paths with Node's path.join ([#307](https://github.com/thelounge/thelounge/pull/307) by [@astorije](https://github.com/astorije))
-
-### Deprecated
-
-- Store channels in array format in user configuration files, deprecating previous format ([#417](https://github.com/thelounge/thelounge/pull/417) by [@xPaw](https://github.com/xPaw))
-
-### Removed
-
-- Disable tooltips on mobile to prevent them to stay after clicking ([#612](https://github.com/thelounge/thelounge/pull/612) by [@astorije](https://github.com/astorije))
-- Remove Docker-related files now that we have a dedicated repository ([#288](https://github.com/thelounge/thelounge/pull/288) by [@astorije](https://github.com/astorije))
-- Remove JavaScript scrollbar library ([#429](https://github.com/thelounge/thelounge/pull/429) by [@xPaw](https://github.com/xPaw))
-- Remove navigator.standalone detection ([#427](https://github.com/thelounge/thelounge/pull/427) by [@xPaw](https://github.com/xPaw))
-- Do not increase font size on highlight in morning theme ([#321](https://github.com/thelounge/thelounge/pull/321) by [@xPaw](https://github.com/xPaw))
-
-### Fixed
-
-- Remove font family redundancy, fix missed fonts, remove Open Sans ([#562](https://github.com/thelounge/thelounge/pull/562) by [@astorije](https://github.com/astorije))
-- Stop propagation when hiding the chat through click/tapping the chat ([#455](https://github.com/thelounge/thelounge/pull/455) by [@williamboman](https://github.com/williamboman))
-- Improve click handling on users and inline channels ([#366](https://github.com/thelounge/thelounge/pull/366) by [@xPaw](https://github.com/xPaw))
-- Only load config if it exists ([#461](https://github.com/thelounge/thelounge/pull/461) by [@xPaw](https://github.com/xPaw))
-- Send user to lobby of deleted chan when parting from active chan ([#489](https://github.com/thelounge/thelounge/pull/489) by [@astorije](https://github.com/astorije))
-- Set title attribute on topic on initial page load ([#515](https://github.com/thelounge/thelounge/pull/515) by [@williamboman](https://github.com/williamboman))
-- Save user's channels when they sort the channel list ([#401](https://github.com/thelounge/thelounge/pull/401) by [@xPaw](https://github.com/xPaw))
-- Turn favicon red on page load if there are highlights ([#344](https://github.com/thelounge/thelounge/pull/344) by [@xPaw](https://github.com/xPaw))
-- Keep chat stickied to the bottom on resize ([#346](https://github.com/thelounge/thelounge/pull/346) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Only increase unread counter for whitelisted actions ([#273](https://github.com/thelounge/thelounge/pull/273) by [@xPaw](https://github.com/xPaw))
-- Parse CTCP replies ([#278](https://github.com/thelounge/thelounge/pull/278) by [@xPaw](https://github.com/xPaw))
-- Do not count your own messages as unread ([#279](https://github.com/thelounge/thelounge/pull/279) by [@xPaw](https://github.com/xPaw))
-- Do not display incorrect nick when switching to a non connected network ([#252](https://github.com/thelounge/thelounge/pull/252) by [@xPaw](https://github.com/xPaw))
-- Keep autocompletion sort whenever user list updates ([#217](https://github.com/thelounge/thelounge/pull/217) by [@xPaw](https://github.com/xPaw))
-- Save user when parting channels ([#297](https://github.com/thelounge/thelounge/pull/297) by [@xPaw](https://github.com/xPaw))
-- Add labels in connect window ([#300](https://github.com/thelounge/thelounge/pull/300) by [@xPaw](https://github.com/xPaw))
-- Add missing `aria-label` on icon buttons ([#303](https://github.com/thelounge/thelounge/pull/303) by [@astorije](https://github.com/astorije))
-- Fix missing colors in action messages ([#317](https://github.com/thelounge/thelounge/pull/317) by [@astorije](https://github.com/astorije))
-- Don't falsely report failed write if it didn't fail ([`e6990e0`](https://github.com/thelounge/thelounge/commit/e6990e0fc7641d18a5bcbabddca1aacf2254ae52) by [@xPaw](https://github.com/xPaw))
-- Fix sending messages starting with a space ([#320](https://github.com/thelounge/thelounge/pull/320) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Fix notifications in query windows ([#334](https://github.com/thelounge/thelounge/pull/334) by [@xPaw](https://github.com/xPaw))
-
-### Security
-
-- Implement user token persistency ([#370](https://github.com/thelounge/thelounge/pull/370) by [@xPaw](https://github.com/xPaw))
-- Restrict access to the home directory by default ([#205](https://github.com/thelounge/thelounge/pull/205) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Add security headers to minimize XSS damage ([#292](https://github.com/thelounge/thelounge/pull/292) by [@xPaw](https://github.com/xPaw))
-- Do not write user configs outside of the app's users directory ([#238](https://github.com/thelounge/thelounge/pull/238) by [@williamboman](https://github.com/williamboman))
-- Don't check for existing password emptiness ([#315](https://github.com/thelounge/thelounge/pull/315) by [@maxpoulin64](https://github.com/maxpoulin64))
-
-## v2.0.0-rc.2 - 2016-09-21 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-rc.1...v2.0.0-rc.2)
-
-This release candidate only fixes a UI bug affecting iOS 8 users, introduced in v2.0.0-pre.5.
-
-### Fixed
-
-- Fix flexboxes to work on iOS 8 ([#626](https://github.com/thelounge/thelounge/pull/626) by [@Gilles123](https://github.com/Gilles123))
-
-## v2.0.0-rc.1 - 2016-09-17 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.7...v2.0.0-rc.1)
-
-Prior to this release, users of Safari 10 were not able to access The Lounge anymore, because of a conscious change the WebKit made to their support of CSP, as [explained here](https://webkit.org/blog/6830/a-refined-content-security-policy/). This release addresses this issue.
-
-Another notable change is the removal of tooltips on mobiles, as hovering states on mobile devices breaks in different kind of ways. Hopefully there will be a better solution in the future, or better support across mobiles.
-
-This is also the first release candidate for v2.0.0. This means only critical bug fixes will be merged before releasing v2.0.0.
-
-### Changed
-
-- Explicitly authorize websockets in CSP header ([#597](https://github.com/thelounge/thelounge/pull/597) by [@astorije](https://github.com/astorije))
-
-### Removed
-
-- Disable tooltips on mobile to prevent them to stay after clicking ([#612](https://github.com/thelounge/thelounge/pull/612) by [@astorije](https://github.com/astorije))
-
-### Fixed
-
-- Fix small input text on Morning and Zenburn ([#601](https://github.com/thelounge/thelounge/pull/601) by [@astorije](https://github.com/astorije))
-- Fix a left margin appearing on all non-default themes ([#615](https://github.com/thelounge/thelounge/pull/615) by [@astorije](https://github.com/astorije))
-
-## v2.0.0-pre.7 - 2016-09-08 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.6...v2.0.0-pre.7)
-
-This prerelease fixes a lot of bugs on both the server and the client. It also adds a theme selector on the client and connection debug log level on the server. Additionally, custom highlights are now case-insensitive.
-
-### Added
-
-- Add tooltips on every clickable icons ([#540](https://github.com/thelounge/thelounge/pull/540) by [@astorije](https://github.com/astorije))
-- Add debug config option for `irc-framework` debug log ([#547](https://github.com/thelounge/thelounge/pull/547) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Client-side theme selector ([#568](https://github.com/thelounge/thelounge/pull/568) by [@astorije](https://github.com/astorije))
-
-### Changed
-
-- Use our logger instead of `console.log` and `console.error` for LDAP logs ([#552](https://github.com/thelounge/thelounge/pull/552) by [@astorije](https://github.com/astorije))
-- Make custom highlights case-insensitive ([#565](https://github.com/thelounge/thelounge/pull/565) by [@astorije](https://github.com/astorije))
-- Bump `request` dependency to 2.74.0 ([#563](https://github.com/thelounge/thelounge/pull/563) by [@astorije](https://github.com/astorije))
-- Mention wiki in README ([#548](https://github.com/thelounge/thelounge/pull/548) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Support ES6 features in JS linting outside of client code ([#593](https://github.com/thelounge/thelounge/pull/593) by [@williamboman](https://github.com/williamboman))
-
-### Fixed
-
-- Fix token persistency across server refreshes ([#553](https://github.com/thelounge/thelounge/pull/553) by [@astorije](https://github.com/astorije))
-- Make sure input height is reset when submitting with icon ([#555](https://github.com/thelounge/thelounge/pull/555) by [@astorije](https://github.com/astorije))
-- Fix webirc and 4-in-6 addresses ([#535](https://github.com/thelounge/thelounge/pull/535) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Allow long URLs to break onto next line on Chrome ([#576](https://github.com/thelounge/thelounge/pull/576) by [@astorije](https://github.com/astorije))
-- Make sure users with wrong tokens are locked out instead of crashing the app ([#570](https://github.com/thelounge/thelounge/pull/570) by [@astorije](https://github.com/astorije))
-- Remove font family redundancy, fix missed fonts, remove Open Sans ([#562](https://github.com/thelounge/thelounge/pull/562) by [@astorije](https://github.com/astorije))
-- Do not set app orientation in manifest to use user setting at OS level ([#587](https://github.com/thelounge/thelounge/pull/587) by [@astorije](https://github.com/astorije))
-- Move border-radius from `#main` to `.window elements` to fix radius once and for all ([#572](https://github.com/thelounge/thelounge/pull/572) by [@astorije](https://github.com/astorije))
-
-## v2.0.0-pre.6 - 2016-08-10 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.5...v2.0.0-pre.6)
-
-LDAP! That's all there is to be found in this pre-release, but it should please some administrators out there. Big thanks to [@thisisdarshan](https://github.com/thisisdarshan) and [@lindskogen](https://github.com/lindskogen) for sticking with us on this one.
-
-This feature will remain in beta version until the official v2.0.0 release.
-
-### Added
-
-- LDAP support ([#477](https://github.com/thelounge/thelounge/pull/477) by [@thisisdarshan](https://github.com/thisisdarshan) and [@lindskogen](https://github.com/lindskogen))
-
-## v2.0.0-pre.5 - 2016-08-07 [Pre-release]
-
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.4...v2.0.0-pre.5)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.4...v2.0.0-pre.5)
What an exciting release! It's been in the works for more than a month, but the perks are worth the wait.
@@ -4091,61 +43,61 @@ Administrators will notice a different format for channels in the user configura
### Added
-- Add custom highlights ([#425](https://github.com/thelounge/thelounge/pull/425) by [@YaManicKill](https://github.com/YaManicKill))
-- Add auto-grow textarea support ([#379](https://github.com/thelounge/thelounge/pull/379) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Display unhandled numerics on the client ([#286](https://github.com/thelounge/thelounge/pull/286) by [@xPaw](https://github.com/xPaw))
-- A proper unread marker ([#332](https://github.com/thelounge/thelounge/pull/332) by [@xPaw](https://github.com/xPaw))
-- Add information on the About section of the client ([#497](https://github.com/thelounge/thelounge/pull/497) by [@astorije](https://github.com/astorije))
-- Add a red dot to the mobile menu icon when being notified ([#486](https://github.com/thelounge/thelounge/pull/486) by [@astorije](https://github.com/astorije))
-- Add "The Lounge" label to the landing pages ([#487](https://github.com/thelounge/thelounge/pull/487) by [@astorije](https://github.com/astorije))
-- Display network name on Connect page when network is locked and info is hidden ([#488](https://github.com/thelounge/thelounge/pull/488) by [@astorije](https://github.com/astorije))
+- Add custom highlights ([#425](https://github.com/thelounge/lounge/pull/425) by [@YaManicKill](https://github.com/YaManicKill))
+- Add auto-grow textarea support ([#379](https://github.com/thelounge/lounge/pull/379) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Display unhandled numerics on the client ([#286](https://github.com/thelounge/lounge/pull/286) by [@xPaw](https://github.com/xPaw))
+- A proper unread marker ([#332](https://github.com/thelounge/lounge/pull/332) by [@xPaw](https://github.com/xPaw))
+- Add information on the About section of the client ([#497](https://github.com/thelounge/lounge/pull/497) by [@astorije](https://github.com/astorije))
+- Add a red dot to the mobile menu icon when being notified ([#486](https://github.com/thelounge/lounge/pull/486) by [@astorije](https://github.com/astorije))
+- Add "The Lounge" label to the landing pages ([#487](https://github.com/thelounge/lounge/pull/487) by [@astorije](https://github.com/astorije))
+- Display network name on Connect page when network is locked and info is hidden ([#488](https://github.com/thelounge/lounge/pull/488) by [@astorije](https://github.com/astorije))
### Changed
-- Store channels in array format in user configuration files ([#417](https://github.com/thelounge/thelounge/pull/417) by [@xPaw](https://github.com/xPaw))
-- Cache loaded config and merge it with defaults ([#387](https://github.com/thelounge/thelounge/pull/387) by [@xPaw](https://github.com/xPaw))
-- Ignore unnecessary files at release time ([#499](https://github.com/thelounge/thelounge/pull/499) by [@astorije](https://github.com/astorije))
-- Improve font icon management, sizing and sharpness ([#493](https://github.com/thelounge/thelounge/pull/493) by [@astorije](https://github.com/astorije))
-- Maintain scroll position after loading previous messages ([#496](https://github.com/thelounge/thelounge/pull/496) by [@davibe](https://github.com/davibe))
+- Store channels in array format in user configuration files ([#417](https://github.com/thelounge/lounge/pull/417) by [@xPaw](https://github.com/xPaw))
+- Cache loaded config and merge it with defaults ([#387](https://github.com/thelounge/lounge/pull/387) by [@xPaw](https://github.com/xPaw))
+- Ignore unnecessary files at release time ([#499](https://github.com/thelounge/lounge/pull/499) by [@astorije](https://github.com/astorije))
+- Improve font icon management, sizing and sharpness ([#493](https://github.com/thelounge/lounge/pull/493) by [@astorije](https://github.com/astorije))
+- Maintain scroll position after loading previous messages ([#496](https://github.com/thelounge/lounge/pull/496) by [@davibe](https://github.com/davibe))
### Removed
-- Remove Docker-related files ([#288](https://github.com/thelounge/thelounge/pull/288) by [@astorije](https://github.com/astorije))
-- Remove JavaScript scrollbar library ([#429](https://github.com/thelounge/thelounge/pull/429) by [@xPaw](https://github.com/xPaw))
+- Remove Docker-related files ([#288](https://github.com/thelounge/lounge/pull/288) by [@astorije](https://github.com/astorije))
+- Remove JavaScript scrollbar library ([#429](https://github.com/thelounge/lounge/pull/429) by [@xPaw](https://github.com/xPaw))
### Fixed
-- Fix storing the updated authentication token ([#437](https://github.com/thelounge/thelounge/pull/437) by [@williamboman](https://github.com/williamboman))
-- Update `irc-framework` to 2.3.0 to fix a bug occurring when posting messages starting with a colon ([#449](https://github.com/thelounge/thelounge/pull/449) by [@xPaw](https://github.com/xPaw))
-- Update `irc-framework` to 2.4.0 to fix a buffering issue ([#451](https://github.com/thelounge/thelounge/pull/451) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Only auto join actual channels ([#453](https://github.com/thelounge/thelounge/pull/453) by [@xPaw](https://github.com/xPaw))
-- Only trigger custom highlights for non-self messages and notices ([#454](https://github.com/thelounge/thelounge/pull/454) by [@xPaw](https://github.com/xPaw))
-- Stop propagation when hiding the chat through click/tapping the chat ([#455](https://github.com/thelounge/thelounge/pull/455) by [@williamboman](https://github.com/williamboman))
-- Improve click handling on users and inline channels ([#366](https://github.com/thelounge/thelounge/pull/366) by [@xPaw](https://github.com/xPaw))
-- Update `irc-framework` to 2.5.0 to fix reconnection counter not being reset ([#451](https://github.com/thelounge/thelounge/pull/451) by [@xPaw](https://github.com/xPaw))
-- Register irc-framework events before connecting ([#458](https://github.com/thelounge/thelounge/pull/458) by [@xPaw](https://github.com/xPaw))
-- Only load config if it exists ([#461](https://github.com/thelounge/thelounge/pull/461) by [@xPaw](https://github.com/xPaw))
-- Fix window layout a bit ([#465](https://github.com/thelounge/thelounge/pull/465) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Fix slight bugs introduced by #379 and #465 ([#467](https://github.com/thelounge/thelounge/pull/467) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Prevent the app from crashing when no theme is specified ([#474](https://github.com/thelounge/thelounge/pull/474) by [@astorije](https://github.com/astorije))
-- Fix unread marker disappearing when opacity set to 1 ([#471](https://github.com/thelounge/thelounge/pull/471) by [@astorije](https://github.com/astorije))
-- Fix breaking layout when switching portrait/landscape modes ([#478](https://github.com/thelounge/thelounge/pull/478) by [@astorije](https://github.com/astorije))
-- Fix chat not being "stickied" to the bottom when joining channel ([#484](https://github.com/thelounge/thelounge/pull/484) by [@williamboman](https://github.com/williamboman))
-- Add self info to TOGGLE messages to prevent unread marker to render for oneself ([#473](https://github.com/thelounge/thelounge/pull/473) by [@astorije](https://github.com/astorije))
-- Send user to lobby of deleted chan when parting from active chan ([#489](https://github.com/thelounge/thelounge/pull/489) by [@astorije](https://github.com/astorije))
-- Use `min-height` of textarea when computing auto-resize after deleting a char ([#504](https://github.com/thelounge/thelounge/pull/504) by [@astorije](https://github.com/astorije))
-- Set title attribute on topic on initial page load ([#515](https://github.com/thelounge/thelounge/pull/515) by [@williamboman](https://github.com/williamboman))
-- Make sure git commit check for the About section would not send stderr to the console ([#516](https://github.com/thelounge/thelounge/pull/516) by [@astorije](https://github.com/astorije))
-- Create a single function to render networks to reduce code duplication ([#445](https://github.com/thelounge/thelounge/pull/445) by [@xPaw](https://github.com/xPaw))
-- Reset the unread marker on channel change ([#527](https://github.com/thelounge/thelounge/pull/527) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Fix accidentally removed border-radius ([#537](https://github.com/thelounge/thelounge/pull/537) by [@astorije](https://github.com/astorije))
-- Fix font size in themes for new textarea ([#536](https://github.com/thelounge/thelounge/pull/536) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Restore padding and height of message input pre-textarea era ([#539](https://github.com/thelounge/thelounge/pull/539) by [@astorije](https://github.com/astorije))
-- Prevent Ctrl-Tab from triggering tab completion ([#541](https://github.com/thelounge/thelounge/pull/541) by [@hho](https://github.com/hho))
+- Fix storing the updated authentication token ([#437](https://github.com/thelounge/lounge/pull/437) by [@williamboman](https://github.com/williamboman))
+- Update `irc-framework` to 2.3.0 to fix a bug occurring when posting messages starting with a colon ([#449](https://github.com/thelounge/lounge/pull/449) by [@xPaw](https://github.com/xPaw))
+- Update `irc-framework` to 2.4.0 to fix a buffering issue ([#451](https://github.com/thelounge/lounge/pull/451) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Only auto join actual channels ([#453](https://github.com/thelounge/lounge/pull/453) by [@xPaw](https://github.com/xPaw))
+- Only trigger custom highlights for non-self messages and notices ([#454](https://github.com/thelounge/lounge/pull/454) by [@xPaw](https://github.com/xPaw))
+- Stop propagation when hiding the chat through click/tapping the chat ([#455](https://github.com/thelounge/lounge/pull/455) by [@williamboman](https://github.com/williamboman))
+- Improve click handling on users and inline channels ([#366](https://github.com/thelounge/lounge/pull/366) by [@xPaw](https://github.com/xPaw))
+- Update `irc-framework` to 2.5.0 to fix reconnection counter not being reset ([#451](https://github.com/thelounge/lounge/pull/451) by [@xPaw](https://github.com/xPaw))
+- Register irc-framework events before connecting ([#458](https://github.com/thelounge/lounge/pull/458) by [@xPaw](https://github.com/xPaw))
+- Only load config if it exists ([#461](https://github.com/thelounge/lounge/pull/461) by [@xPaw](https://github.com/xPaw))
+- Fix window layout a bit ([#465](https://github.com/thelounge/lounge/pull/465) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Fix slight bugs introduced by #379 and #465 ([#467](https://github.com/thelounge/lounge/pull/467) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Prevent the app from crashing when no theme is specified ([#474](https://github.com/thelounge/lounge/pull/474) by [@astorije](https://github.com/astorije))
+- Fix unread marker disappearing when opacity set to 1 ([#471](https://github.com/thelounge/lounge/pull/471) by [@astorije](https://github.com/astorije))
+- Fix breaking layout when switching portrait/landscape modes ([#478](https://github.com/thelounge/lounge/pull/478) by [@astorije](https://github.com/astorije))
+- Fix chat not being "stickied" to the bottom when joining channel ([#484](https://github.com/thelounge/lounge/pull/484) by [@williamboman](https://github.com/williamboman))
+- Add self info to TOGGLE messages to prevent unread marker to render for oneself ([#473](https://github.com/thelounge/lounge/pull/473) by [@astorije](https://github.com/astorije))
+- Send user to lobby of deleted chan when parting from active chan ([#489](https://github.com/thelounge/lounge/pull/489) by [@astorije](https://github.com/astorije))
+- Use `min-height` of textarea when computing auto-resize after deleting a char ([#504](https://github.com/thelounge/lounge/pull/504) by [@astorije](https://github.com/astorije))
+- Set title attribute on topic on initial page load ([#515](https://github.com/thelounge/lounge/pull/515) by [@williamboman](https://github.com/williamboman))
+- Make sure git commit check for the About section would not send stderr to the console ([#516](https://github.com/thelounge/lounge/pull/516) by [@astorije](https://github.com/astorije))
+- Create a single function to render networks to reduce code duplication ([#445](https://github.com/thelounge/lounge/pull/445) by [@xPaw](https://github.com/xPaw))
+- Reset the unread marker on channel change ([#527](https://github.com/thelounge/lounge/pull/527) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Fix accidentally removed border-radius ([#537](https://github.com/thelounge/lounge/pull/537) by [@astorije](https://github.com/astorije))
+- Fix font size in themes for new textarea ([#536](https://github.com/thelounge/lounge/pull/536) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Restore padding and height of message input pre-textarea era ([#539](https://github.com/thelounge/lounge/pull/539) by [@astorije](https://github.com/astorije))
+- Prevent Ctrl-Tab from triggering tab completion ([#541](https://github.com/thelounge/lounge/pull/541) by [@hho](https://github.com/hho))
## v2.0.0-pre.4 - 2016-06-29 [Pre-release]
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.3...v2.0.0-pre.4)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.3...v2.0.0-pre.4)
This pre-release adds a loading window, helpful on slow connections.
It also implements token persistency, ensuring users do not have to authenticate at every server restart. As a side effect, security is improved by forcing logging out users on all devices when changing their password.
@@ -4161,161 +113,161 @@ Internally, we now keep track of our code coverage, which we do not enforce stri
### Added
-- Add code coverage ([#408](https://github.com/thelounge/thelounge/pull/408) by [@astorije](https://github.com/astorije))
-- Display a loading message instead of blank page ([#386](https://github.com/thelounge/thelounge/pull/386) by [@xPaw](https://github.com/xPaw))
+- Add code coverage ([#408](https://github.com/thelounge/lounge/pull/408) by [@astorije](https://github.com/astorije))
+- Display a loading message instead of blank page ([#386](https://github.com/thelounge/lounge/pull/386) by [@xPaw](https://github.com/xPaw))
### Changed
-- Perform node version check as soon as possible ([#409](https://github.com/thelounge/thelounge/pull/409) by [@xPaw](https://github.com/xPaw))
-- Prepend http protocol to www. links in chat ([#410](https://github.com/thelounge/thelounge/pull/410) by [@xPaw](https://github.com/xPaw))
-- Use tabs when saving user configs ([#418](https://github.com/thelounge/thelounge/pull/418) by [@xPaw](https://github.com/xPaw))
-- Do not display the sidebar on sign-in page ([#420](https://github.com/thelounge/thelounge/pull/420) by [@astorije](https://github.com/astorije))
-- Make style of loading page similar to other pages ([#423](https://github.com/thelounge/thelounge/pull/423) by [@astorije](https://github.com/astorije))
-- Change default configuration for `host` to allow OS to decide and use both IPv4 and IPv6 ([#432](https://github.com/thelounge/thelounge/pull/432) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Change nicks from links to spans everywhere ([#428](https://github.com/thelounge/thelounge/pull/428) by [@xPaw](https://github.com/xPaw))
-- Increase join delay at connection to 1000ms ([#434](https://github.com/thelounge/thelounge/pull/434) by [@williamboman](https://github.com/williamboman))
+- Perform node version check as soon as possible ([#409](https://github.com/thelounge/lounge/pull/409) by [@xPaw](https://github.com/xPaw))
+- Prepend http protocol to www. links in chat ([#410](https://github.com/thelounge/lounge/pull/410) by [@xPaw](https://github.com/xPaw))
+- Use tabs when saving user configs ([#418](https://github.com/thelounge/lounge/pull/418) by [@xPaw](https://github.com/xPaw))
+- Do not display the sidebar on sign-in page ([#420](https://github.com/thelounge/lounge/pull/420) by [@astorije](https://github.com/astorije))
+- Make style of loading page similar to other pages ([#423](https://github.com/thelounge/lounge/pull/423) by [@astorije](https://github.com/astorije))
+- Change default configuration for `host` to allow OS to decide and use both IPv4 and IPv6 ([#432](https://github.com/thelounge/lounge/pull/432) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Change nicks from links to spans everywhere ([#428](https://github.com/thelounge/lounge/pull/428) by [@xPaw](https://github.com/xPaw))
+- Increase join delay at connection to 1000ms ([#434](https://github.com/thelounge/lounge/pull/434) by [@williamboman](https://github.com/williamboman))
### Removed
-- Remove navigator.standalone detection ([#427](https://github.com/thelounge/thelounge/pull/427) by [@xPaw](https://github.com/xPaw))
+- Remove navigator.standalone detection ([#427](https://github.com/thelounge/lounge/pull/427) by [@xPaw](https://github.com/xPaw))
### Fixed
-- Do not lose authentication token when the connection gets lost ([#369](https://github.com/thelounge/thelounge/pull/369) by [@xPaw](https://github.com/xPaw))
-- Fix crash in public mode ([#413](https://github.com/thelounge/thelounge/pull/413) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Do not print user loaded message in public mode ([#415](https://github.com/thelounge/thelounge/pull/415) by [@xPaw](https://github.com/xPaw))
-- Fix focusing input when clicking chat container on the client ([#364](https://github.com/thelounge/thelounge/pull/364) by [@williamboman](https://github.com/williamboman))
-- Fix channel join regression and fix possibly joining parted channels ([#411](https://github.com/thelounge/thelounge/pull/411) by [@xPaw](https://github.com/xPaw))
+- Do not lose authentication token when the connection gets lost ([#369](https://github.com/thelounge/lounge/pull/369) by [@xPaw](https://github.com/xPaw))
+- Fix crash in public mode ([#413](https://github.com/thelounge/lounge/pull/413) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Do not print user loaded message in public mode ([#415](https://github.com/thelounge/lounge/pull/415) by [@xPaw](https://github.com/xPaw))
+- Fix focusing input when clicking chat container on the client ([#364](https://github.com/thelounge/lounge/pull/364) by [@williamboman](https://github.com/williamboman))
+- Fix channel join regression and fix possibly joining parted channels ([#411](https://github.com/thelounge/lounge/pull/411) by [@xPaw](https://github.com/xPaw))
### Security
-- Implement user token persistency ([#370](https://github.com/thelounge/thelounge/pull/370) by [@xPaw](https://github.com/xPaw))
+- Implement user token persistency ([#370](https://github.com/thelounge/lounge/pull/370) by [@xPaw](https://github.com/xPaw))
## v2.0.0-pre.3 - 2016-06-15 [Pre-release]
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.2...v2.0.0-pre.3)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.2...v2.0.0-pre.3)
This release introduces a few internal changes as well as two noticeable ones. When using the CLI, the home path can now be set with the `LOUNGE_HOME` environment variable, to avoid repeating `--home` over and over. On the client, sorting channels will now be saved in the user configuration.
### Added
-- Fall back to LOUNGE_HOME env variable when using the CLI ([#402](https://github.com/thelounge/thelounge/pull/402) by [@williamboman](https://github.com/williamboman))
+- Fall back to LOUNGE_HOME env variable when using the CLI ([#402](https://github.com/thelounge/lounge/pull/402) by [@williamboman](https://github.com/williamboman))
### Changed
-- Rename package variable to pkg, as "package" is reserved. ([#399](https://github.com/thelounge/thelounge/pull/399) by [@hogofwar](https://github.com/hogofwar))
-- Capitalise constructor Oidentd ([#396](https://github.com/thelounge/thelounge/pull/396) by [@hogofwar](https://github.com/hogofwar))
-- Bump stylelint and update Travis CI configuration to include OSX builds and package caching ([#403](https://github.com/thelounge/thelounge/pull/403) by [@xPaw](https://github.com/xPaw))
+- Rename package variable to pkg, as "package" is reserved. ([#399](https://github.com/thelounge/lounge/pull/399) by [@hogofwar](https://github.com/hogofwar))
+- Capitalise constructor Oidentd ([#396](https://github.com/thelounge/lounge/pull/396) by [@hogofwar](https://github.com/hogofwar))
+- Bump stylelint and update Travis CI configuration to include OSX builds and package caching ([#403](https://github.com/thelounge/lounge/pull/403) by [@xPaw](https://github.com/xPaw))
### Removed
-- Supersede `mkdirp` with `fs-extra` ([#390](https://github.com/thelounge/thelounge/pull/390) by [@hogofwar](https://github.com/hogofwar))
-- Remove redundant variables ([#397](https://github.com/thelounge/thelounge/pull/397) by [@hogofwar](https://github.com/hogofwar))
+- Supersede `mkdirp` with `fs-extra` ([#390](https://github.com/thelounge/lounge/pull/390) by [@hogofwar](https://github.com/hogofwar))
+- Remove redundant variables ([#397](https://github.com/thelounge/lounge/pull/397) by [@hogofwar](https://github.com/hogofwar))
### Fixed
-- Save user's channels when they sort the channel list ([#401](https://github.com/thelounge/thelounge/pull/401) by [@xPaw](https://github.com/xPaw))
-- Fix description of `host` and `bind` config options ([#378](https://github.com/thelounge/thelounge/pull/378) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Save user's channels when they sort the channel list ([#401](https://github.com/thelounge/lounge/pull/401) by [@xPaw](https://github.com/xPaw))
+- Fix description of `host` and `bind` config options ([#378](https://github.com/thelounge/lounge/pull/378) by [@maxpoulin64](https://github.com/maxpoulin64))
## v2.0.0-pre.2 - 2016-06-09 [Pre-release]
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v2.0.0-pre.1...v2.0.0-pre.2)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v2.0.0-pre.1...v2.0.0-pre.2)
This pre-release adds a very, very long-awaited feature: auto-reconnection! It also extends our support of ident with oidentd, shows timestamps on small screens and fix bugs around notifications and sticky scroll.
### Added
-- Enable auto reconnection ([#254](https://github.com/thelounge/thelounge/pull/254) by [@xPaw](https://github.com/xPaw))
-- Add "!" modechar for admin ([#354](https://github.com/thelounge/thelounge/pull/354) by [@omnicons](https://github.com/omnicons))
-- Add CI tool for Windows builds ([#367](https://github.com/thelounge/thelounge/pull/367) by [@astorije](https://github.com/astorije))
-- Add support for oidentd spoofing ([#256](https://github.com/thelounge/thelounge/pull/256) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Enable auto reconnection ([#254](https://github.com/thelounge/lounge/pull/254) by [@xPaw](https://github.com/xPaw))
+- Add "!" modechar for admin ([#354](https://github.com/thelounge/lounge/pull/354) by [@omnicons](https://github.com/omnicons))
+- Add CI tool for Windows builds ([#367](https://github.com/thelounge/lounge/pull/367) by [@astorije](https://github.com/astorije))
+- Add support for oidentd spoofing ([#256](https://github.com/thelounge/lounge/pull/256) by [@maxpoulin64](https://github.com/maxpoulin64))
### Changed
-- Update Font Awesome to v4.6.3 ([#355](https://github.com/thelounge/thelounge/pull/355) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Do not hide timestamps on small viewports ([#376](https://github.com/thelounge/thelounge/pull/376) by [@xPaw](https://github.com/xPaw))
-- Fetch Font Awesome from npm instead of embedded in repo ([#361](https://github.com/thelounge/thelounge/pull/361) by [@astorije](https://github.com/astorije))
-- Cache npm modules on appveyor ([#381](https://github.com/thelounge/thelounge/pull/381) by [@xPaw](https://github.com/xPaw))
-- Update eslint and enforce key-spacing ([#384](https://github.com/thelounge/thelounge/pull/384) by [@xPaw](https://github.com/xPaw))
-- Use `npm-run-all` in npm scripts for testing and linting ([#375](https://github.com/thelounge/thelounge/pull/375) by [@williamboman](https://github.com/williamboman))
-- Upload test results on appveyor builds ([#382](https://github.com/thelounge/thelounge/pull/382) by [@xPaw](https://github.com/xPaw))
+- Update Font Awesome to v4.6.3 ([#355](https://github.com/thelounge/lounge/pull/355) by [@MaxLeiter](https://github.com/MaxLeiter))
+- Do not hide timestamps on small viewports ([#376](https://github.com/thelounge/lounge/pull/376) by [@xPaw](https://github.com/xPaw))
+- Fetch Font Awesome from npm instead of embedded in repo ([#361](https://github.com/thelounge/lounge/pull/361) by [@astorije](https://github.com/astorije))
+- Cache npm modules on appveyor ([#381](https://github.com/thelounge/lounge/pull/381) by [@xPaw](https://github.com/xPaw))
+- Update eslint and enforce key-spacing ([#384](https://github.com/thelounge/lounge/pull/384) by [@xPaw](https://github.com/xPaw))
+- Use `npm-run-all` in npm scripts for testing and linting ([#375](https://github.com/thelounge/lounge/pull/375) by [@williamboman](https://github.com/williamboman))
+- Upload test results on appveyor builds ([#382](https://github.com/thelounge/lounge/pull/382) by [@xPaw](https://github.com/xPaw))
### Fixed
-- Turn favicon red on page load if there are highlights ([#344](https://github.com/thelounge/thelounge/pull/344) by [@xPaw](https://github.com/xPaw))
-- Do not send completely empty messages ([#345](https://github.com/thelounge/thelounge/pull/345) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Make sure npm test script gets run on AppVeyor ([#372](https://github.com/thelounge/thelounge/pull/372) by [@astorije](https://github.com/astorije))
-- Keep chat stickied to the bottom on resize ([#346](https://github.com/thelounge/thelounge/pull/346) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Turn favicon red on page load if there are highlights ([#344](https://github.com/thelounge/lounge/pull/344) by [@xPaw](https://github.com/xPaw))
+- Do not send completely empty messages ([#345](https://github.com/thelounge/lounge/pull/345) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Make sure npm test script gets run on AppVeyor ([#372](https://github.com/thelounge/lounge/pull/372) by [@astorije](https://github.com/astorije))
+- Keep chat stickied to the bottom on resize ([#346](https://github.com/thelounge/lounge/pull/346) by [@maxpoulin64](https://github.com/maxpoulin64))
## v2.0.0-pre.1 - 2016-05-22 [Pre-release]
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.5.0...v2.0.0-pre.1)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.5.0...v2.0.0-pre.1)
-This is a pre-release to allow early adopters to use The Lounge with [`irc-framework`](https://github.com/kiwiirc/irc-framework) as our underlying IRC library instead of [`slate`](https://github.com/slate/slate-irc). This change itself solves a lot of issues and adds many features, most of them [listed here](https://github.com/thelounge/thelounge/pull/167#issue-139286868): IRCv3 compliance, user feedback improvement, etc.
+This is a pre-release to allow early adopters to use The Lounge with [`irc-framework`](https://github.com/kiwiirc/irc-framework) as our underlying IRC library instead of [`slate`](https://github.com/slate/slate-irc). This change itself solves a lot of issues and adds many features, most of them [listed here](https://github.com/thelounge/lounge/pull/167#issue-139286868): IRCv3 compliance, user feedback improvement, etc.
It also adds WEBIRC support, a better server logging capability, a web app manifest, improves the sticky scroll, and fixes a ton of bugs.
### Added
-- Log enabled capabilities ([#272](https://github.com/thelounge/thelounge/pull/272) by [@xPaw](https://github.com/xPaw))
-- Add global logging helper ([#257](https://github.com/thelounge/thelounge/pull/257) by [@xPaw](https://github.com/xPaw))
-- Add support for `~` home folder expansion ([#284](https://github.com/thelounge/thelounge/pull/284) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Document supported node version ([#280](https://github.com/thelounge/thelounge/pull/280) by [@xPaw](https://github.com/xPaw))
-- Add support for echo-message and znc.in/self-message caps ([#270](https://github.com/thelounge/thelounge/pull/270) by [@xPaw](https://github.com/xPaw))
-- Implement WEBIRC ([#240](https://github.com/thelounge/thelounge/pull/240) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Add `manifest.json` for nicer mobile experience ([#310](https://github.com/thelounge/thelounge/pull/310) by [@xPaw](https://github.com/xPaw))
+- Log enabled capabilities ([#272](https://github.com/thelounge/lounge/pull/272) by [@xPaw](https://github.com/xPaw))
+- Add global logging helper ([#257](https://github.com/thelounge/lounge/pull/257) by [@xPaw](https://github.com/xPaw))
+- Add support for `~` home folder expansion ([#284](https://github.com/thelounge/lounge/pull/284) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Document supported node version ([#280](https://github.com/thelounge/lounge/pull/280) by [@xPaw](https://github.com/xPaw))
+- Add support for echo-message and znc.in/self-message caps ([#270](https://github.com/thelounge/lounge/pull/270) by [@xPaw](https://github.com/xPaw))
+- Implement WEBIRC ([#240](https://github.com/thelounge/lounge/pull/240) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Add `manifest.json` for nicer mobile experience ([#310](https://github.com/thelounge/lounge/pull/310) by [@xPaw](https://github.com/xPaw))
### Changed
-- Drop `slate-irc`, switch to `irc-framework` ([#167](https://github.com/thelounge/thelounge/pull/167) by [@xPaw](https://github.com/xPaw))
-- Create a single helper function to write messages ([#266](https://github.com/thelounge/thelounge/pull/266) by [@xPaw](https://github.com/xPaw))
-- Update dependencies ([#281](https://github.com/thelounge/thelounge/pull/281) by [@xPaw](https://github.com/xPaw))
-- Improve sticky scroll ([#262](https://github.com/thelounge/thelounge/pull/262) by [@xPaw](https://github.com/xPaw))
-- Change license link to point at our license file ([#290](https://github.com/thelounge/thelounge/pull/290) by [@xPaw](https://github.com/xPaw))
-- Stricter eslint rule for curly brackets ([#291](https://github.com/thelounge/thelounge/pull/291) by [@xPaw](https://github.com/xPaw))
-- Bump patch version of lodash to 4.11.2 ([#306](https://github.com/thelounge/thelounge/pull/306) by [@astorije](https://github.com/astorije))
-- Minor wording changes for better clarity ([#305](https://github.com/thelounge/thelounge/pull/305) by [@astorije](https://github.com/astorije))
-- Improve tests execution ([#260](https://github.com/thelounge/thelounge/pull/260) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Update irc-framework ([#324](https://github.com/thelounge/thelounge/pull/324) by [@xPaw](https://github.com/xPaw))
-- Do not ignore our handlebars plugins in ESLint ([#329](https://github.com/thelounge/thelounge/pull/329) by [@xPaw](https://github.com/xPaw))
-- Improve nick highlights ([#327](https://github.com/thelounge/thelounge/pull/327) by [@xPaw](https://github.com/xPaw))
-- CSS classes in themes for nick colors ([#325](https://github.com/thelounge/thelounge/pull/325) by [@astorije](https://github.com/astorije))
-- Replace all concatenated paths with Node's path.join ([#307](https://github.com/thelounge/thelounge/pull/307) by [@astorije](https://github.com/astorije))
+- Drop `slate-irc`, switch to `irc-framework` ([#167](https://github.com/thelounge/lounge/pull/167) by [@xPaw](https://github.com/xPaw))
+- Create a single helper function to write messages ([#266](https://github.com/thelounge/lounge/pull/266) by [@xPaw](https://github.com/xPaw))
+- Update dependencies ([#281](https://github.com/thelounge/lounge/pull/281) by [@xPaw](https://github.com/xPaw))
+- Improve sticky scroll ([#262](https://github.com/thelounge/lounge/pull/262) by [@xPaw](https://github.com/xPaw))
+- Change license link to point at our license file ([#290](https://github.com/thelounge/lounge/pull/290) by [@xPaw](https://github.com/xPaw))
+- Stricter eslint rule for curly brackets ([#291](https://github.com/thelounge/lounge/pull/291) by [@xPaw](https://github.com/xPaw))
+- Bump patch version of lodash to 4.11.2 ([#306](https://github.com/thelounge/lounge/pull/306) by [@astorije](https://github.com/astorije))
+- Minor wording changes for better clarity ([#305](https://github.com/thelounge/lounge/pull/305) by [@astorije](https://github.com/astorije))
+- Improve tests execution ([#260](https://github.com/thelounge/lounge/pull/260) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Update irc-framework ([#324](https://github.com/thelounge/lounge/pull/324) by [@xPaw](https://github.com/xPaw))
+- Do not ignore our handlebars plugins in ESLint ([#329](https://github.com/thelounge/lounge/pull/329) by [@xPaw](https://github.com/xPaw))
+- Improve nick highlights ([#327](https://github.com/thelounge/lounge/pull/327) by [@xPaw](https://github.com/xPaw))
+- CSS classes in themes for nick colors ([#325](https://github.com/thelounge/lounge/pull/325) by [@astorije](https://github.com/astorije))
+- Replace all concatenated paths with Node's path.join ([#307](https://github.com/thelounge/lounge/pull/307) by [@astorije](https://github.com/astorije))
### Removed
-- Do not increase font size on highlight in morning theme ([#321](https://github.com/thelounge/thelounge/pull/321) by [@xPaw](https://github.com/xPaw))
+- Do not increase font size on highlight in morning theme ([#321](https://github.com/thelounge/lounge/pull/321) by [@xPaw](https://github.com/xPaw))
### Fixed
-- Only increase unread counter for whitelisted actions ([#273](https://github.com/thelounge/thelounge/pull/273) by [@xPaw](https://github.com/xPaw))
-- Parse CTCP replies ([#278](https://github.com/thelounge/thelounge/pull/278) by [@xPaw](https://github.com/xPaw))
-- Do not count your own messages as unread ([#279](https://github.com/thelounge/thelounge/pull/279) by [@xPaw](https://github.com/xPaw))
-- Use lowercase global to avoid a deprecation warning in Node.js 6 ([`d9a0dd9`](https://github.com/thelounge/thelounge/commit/d9a0dd9406e8fb22d7a5ee1ed4ed7aa8e5f0fa01) by [@xPaw](https://github.com/xPaw))
-- Do not display incorrect nick when switching to a non connected network ([#252](https://github.com/thelounge/thelounge/pull/252) by [@xPaw](https://github.com/xPaw))
-- Keep autocompletion sort whenever user list updates ([#217](https://github.com/thelounge/thelounge/pull/217) by [@xPaw](https://github.com/xPaw))
-- Make sure app does not crash when webirc is not defined in the configuration ([#294](https://github.com/thelounge/thelounge/pull/294) by [@astorije](https://github.com/astorije))
-- Save user when parting channels ([#297](https://github.com/thelounge/thelounge/pull/297) by [@xPaw](https://github.com/xPaw))
-- Add labels in connect window ([#300](https://github.com/thelounge/thelounge/pull/300) by [@xPaw](https://github.com/xPaw))
-- Add missing `aria-label` on icon buttons ([#303](https://github.com/thelounge/thelounge/pull/303) by [@astorije](https://github.com/astorije))
-- Fix unread counter not being formatted on page load ([#308](https://github.com/thelounge/thelounge/pull/308) by [@xPaw](https://github.com/xPaw))
-- Fix wrong CSS for disabled colored nicknames on themes ([#318](https://github.com/thelounge/thelounge/pull/318) by [@astorije](https://github.com/astorije))
-- Fix missing colors in action messages ([#317](https://github.com/thelounge/thelounge/pull/317) by [@astorije](https://github.com/astorije))
-- Don't falsely report failed write if it didn't fail ([`e6990e0`](https://github.com/thelounge/thelounge/commit/e6990e0fc7641d18a5bcbabddca1aacf2254ae52) by [@xPaw](https://github.com/xPaw))
-- Fix sending messages starting with a space ([#320](https://github.com/thelounge/thelounge/pull/320) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Fix notifications in query windows ([#334](https://github.com/thelounge/thelounge/pull/334) by [@xPaw](https://github.com/xPaw))
+- Only increase unread counter for whitelisted actions ([#273](https://github.com/thelounge/lounge/pull/273) by [@xPaw](https://github.com/xPaw))
+- Parse CTCP replies ([#278](https://github.com/thelounge/lounge/pull/278) by [@xPaw](https://github.com/xPaw))
+- Do not count your own messages as unread ([#279](https://github.com/thelounge/lounge/pull/279) by [@xPaw](https://github.com/xPaw))
+- Use lowercase global to avoid a deprecation warning in Node.js 6 ([`d9a0dd9`](https://github.com/thelounge/lounge/commit/d9a0dd9406e8fb22d7a5ee1ed4ed7aa8e5f0fa01) by [@xPaw](https://github.com/xPaw))
+- Do not display incorrect nick when switching to a non connected network ([#252](https://github.com/thelounge/lounge/pull/252) by [@xPaw](https://github.com/xPaw))
+- Keep autocompletion sort whenever user list updates ([#217](https://github.com/thelounge/lounge/pull/217) by [@xPaw](https://github.com/xPaw))
+- Make sure app does not crash when webirc is not defined in the configuration ([#294](https://github.com/thelounge/lounge/pull/294) by [@astorije](https://github.com/astorije))
+- Save user when parting channels ([#297](https://github.com/thelounge/lounge/pull/297) by [@xPaw](https://github.com/xPaw))
+- Add labels in connect window ([#300](https://github.com/thelounge/lounge/pull/300) by [@xPaw](https://github.com/xPaw))
+- Add missing `aria-label` on icon buttons ([#303](https://github.com/thelounge/lounge/pull/303) by [@astorije](https://github.com/astorije))
+- Fix unread counter not being formatted on page load ([#308](https://github.com/thelounge/lounge/pull/308) by [@xPaw](https://github.com/xPaw))
+- Fix wrong CSS for disabled colored nicknames on themes ([#318](https://github.com/thelounge/lounge/pull/318) by [@astorije](https://github.com/astorije))
+- Fix missing colors in action messages ([#317](https://github.com/thelounge/lounge/pull/317) by [@astorije](https://github.com/astorije))
+- Don't falsely report failed write if it didn't fail ([`e6990e0`](https://github.com/thelounge/lounge/commit/e6990e0fc7641d18a5bcbabddca1aacf2254ae52) by [@xPaw](https://github.com/xPaw))
+- Fix sending messages starting with a space ([#320](https://github.com/thelounge/lounge/pull/320) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Fix notifications in query windows ([#334](https://github.com/thelounge/lounge/pull/334) by [@xPaw](https://github.com/xPaw))
### Security
-- Restrict access to the home directory by default ([#205](https://github.com/thelounge/thelounge/pull/205) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Update demo link to HTTPS ([#302](https://github.com/thelounge/thelounge/pull/302) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Add security headers to minimize XSS damage ([#292](https://github.com/thelounge/thelounge/pull/292) by [@xPaw](https://github.com/xPaw))
-- Do not write user configs outside of the app's users directory ([#238](https://github.com/thelounge/thelounge/pull/238) by [@williamboman](https://github.com/williamboman))
-- Don't check for existing password emptiness ([#315](https://github.com/thelounge/thelounge/pull/315) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Restrict access to the home directory by default ([#205](https://github.com/thelounge/lounge/pull/205) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Update demo link to HTTPS ([#302](https://github.com/thelounge/lounge/pull/302) by [@MaxLeiter](https://github.com/MaxLeiter))
+- Add security headers to minimize XSS damage ([#292](https://github.com/thelounge/lounge/pull/292) by [@xPaw](https://github.com/xPaw))
+- Do not write user configs outside of the app's users directory ([#238](https://github.com/thelounge/lounge/pull/238) by [@williamboman](https://github.com/williamboman))
+- Don't check for existing password emptiness ([#315](https://github.com/thelounge/lounge/pull/315) by [@maxpoulin64](https://github.com/maxpoulin64))
## v1.5.0 - 2016-04-13
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.4.3...v1.5.0)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.4.3...v1.5.0)
With this release, administrators can now define a maximum size for channel history.
While this is not optimal nor the definitive solution, it aims at reducing stability issues where The Lounge would crash after filling up the server's memory.
@@ -4324,255 +276,255 @@ Other changes noticeable by users include removing custom print styles and preve
### Added
-- Add config option to limit in-memory history size ([#243](https://github.com/thelounge/thelounge/pull/243) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Add config option to limit in-memory history size ([#243](https://github.com/thelounge/lounge/pull/243) by [@maxpoulin64](https://github.com/maxpoulin64))
### Changed
-- Do not parse link titles for IRC formatting ([#245](https://github.com/thelounge/thelounge/pull/245) by [@xPaw](https://github.com/xPaw))
-- Display multiple white spaces properly ([#239](https://github.com/thelounge/thelounge/pull/239) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Reword password prompt of `add` and `reset` CLI commands ([#230](https://github.com/thelounge/thelounge/pull/230) by [@williamboman](https://github.com/williamboman))
+- Do not parse link titles for IRC formatting ([#245](https://github.com/thelounge/lounge/pull/245) by [@xPaw](https://github.com/xPaw))
+- Display multiple white spaces properly ([#239](https://github.com/thelounge/lounge/pull/239) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Reword password prompt of `add` and `reset` CLI commands ([#230](https://github.com/thelounge/lounge/pull/230) by [@williamboman](https://github.com/williamboman))
### Removed
-- Remove print styles ([#228](https://github.com/thelounge/thelounge/pull/228) by [@xPaw](https://github.com/xPaw))
+- Remove print styles ([#228](https://github.com/thelounge/lounge/pull/228) by [@xPaw](https://github.com/xPaw))
## v1.4.3 - 2016-04-02
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.4.2...v1.4.3)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.4.2...v1.4.3)
This PR fixes a bug introduced in v1.3.0 which prevents deleting disconnected networks from users' configuration files.
### Fixed
-- Fix not being able to remove networks from user config ([#233](https://github.com/thelounge/thelounge/pull/233) by [@xPaw](https://github.com/xPaw))
+- Fix not being able to remove networks from user config ([#233](https://github.com/thelounge/lounge/pull/233) by [@xPaw](https://github.com/xPaw))
## v1.4.2 - 2016-03-31
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.4.1...v1.4.2)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.4.1...v1.4.2)
This PR fixes a bug introduced in v1.4.1 causing timestamps to use most of the screen.
### Fixed
-- Hide options will now remove the entire row ([#227](https://github.com/thelounge/thelounge/pull/227) by [@xPaw](https://github.com/xPaw))
+- Hide options will now remove the entire row ([#227](https://github.com/thelounge/lounge/pull/227) by [@xPaw](https://github.com/xPaw))
## v1.4.1 - 2016-03-28
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.4.0...v1.4.1)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.4.0...v1.4.1)
As of this release, running `/query nick` will simply open a chat window with user `nick`, instead of calling `whois` for this user.
### Changed
-- Remove `join`, `nick` and `whois` inputs, they are cleanly handled by the server ([#208](https://github.com/thelounge/thelounge/pull/208) by [@xPaw](https://github.com/xPaw))
-- Add a `/query` command that simply opens a query window ([#218](https://github.com/thelounge/thelounge/pull/218) by [@xPaw](https://github.com/xPaw))
-- Disallow `/query` on non-nicks ([#221](https://github.com/thelounge/thelounge/pull/221) by [@astorije](https://github.com/astorije))
+- Remove `join`, `nick` and `whois` inputs, they are cleanly handled by the server ([#208](https://github.com/thelounge/lounge/pull/208) by [@xPaw](https://github.com/xPaw))
+- Add a `/query` command that simply opens a query window ([#218](https://github.com/thelounge/lounge/pull/218) by [@xPaw](https://github.com/xPaw))
+- Disallow `/query` on non-nicks ([#221](https://github.com/thelounge/lounge/pull/221) by [@astorije](https://github.com/astorije))
### Fixed
-- Fix message and topic text wrapping ([#215](https://github.com/thelounge/thelounge/pull/215) by [@xPaw](https://github.com/xPaw))
-- Fix `/part` command ([#222](https://github.com/thelounge/thelounge/pull/222) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Harden URL fetcher and don't crash on non-ASCII urls ([#219](https://github.com/thelounge/thelounge/pull/219) by [@xPaw](https://github.com/xPaw))
+- Fix message and topic text wrapping ([#215](https://github.com/thelounge/lounge/pull/215) by [@xPaw](https://github.com/xPaw))
+- Fix `/part` command ([#222](https://github.com/thelounge/lounge/pull/222) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Harden URL fetcher and don't crash on non-ASCII urls ([#219](https://github.com/thelounge/lounge/pull/219) by [@xPaw](https://github.com/xPaw))
## v1.4.0 - 2016-03-20
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.3.1...v1.4.0)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.3.1...v1.4.0)
Note that this release will reset users' notification settings to their defaults. This unfortunate side effect is the consequence of an improvement of how this setting is handled in the application.
### Added
-- Add context menu when right-clicking on a sidebar item ([#9](https://github.com/thelounge/thelounge/pull/9) by [@xPaw](https://github.com/xPaw))
-- Add tests for the `Chan#sortUsers` method ([#197](https://github.com/thelounge/thelounge/pull/197) by [@astorije](https://github.com/astorije))
-- Add a very basic test for `Network#export` ([#198](https://github.com/thelounge/thelounge/pull/198) by [@astorije](https://github.com/astorije))
-- Link to the demo from the IRC channel badge on the README ([#203](https://github.com/thelounge/thelounge/pull/203) by [@Henni](https://github.com/Henni))
-- Add support for HTTP/2 ([#174](https://github.com/thelounge/thelounge/pull/174) by [@xPaw](https://github.com/xPaw))
-- Support port in `/connect` command ([#210](https://github.com/thelounge/thelounge/pull/210) by [@xPaw](https://github.com/xPaw))
+- Add context menu when right-clicking on a sidebar item ([#9](https://github.com/thelounge/lounge/pull/9) by [@xPaw](https://github.com/xPaw))
+- Add tests for the `Chan#sortUsers` method ([#197](https://github.com/thelounge/lounge/pull/197) by [@astorije](https://github.com/astorije))
+- Add a very basic test for `Network#export` ([#198](https://github.com/thelounge/lounge/pull/198) by [@astorije](https://github.com/astorije))
+- Link to the demo from the IRC channel badge on the README ([#203](https://github.com/thelounge/lounge/pull/203) by [@Henni](https://github.com/Henni))
+- Add support for HTTP/2 ([#174](https://github.com/thelounge/lounge/pull/174) by [@xPaw](https://github.com/xPaw))
+- Support port in `/connect` command ([#210](https://github.com/thelounge/lounge/pull/210) by [@xPaw](https://github.com/xPaw))
### Changed
-- Update Handlebars to 4.0.5 ([#140](https://github.com/thelounge/thelounge/pull/140) by [@xPaw](https://github.com/xPaw))
-- Update Socket.IO to 1.4.5 and use client library provided by the dependency ([#142](https://github.com/thelounge/thelounge/pull/142) by [@xPaw](https://github.com/xPaw))
-- Update ESLint to 2.3.0 and add stricter rules ([#171](https://github.com/thelounge/thelounge/pull/171) by [@xPaw](https://github.com/xPaw))
-- Mute color of the topic actions ([#151](https://github.com/thelounge/thelounge/pull/151) by [@astorije](https://github.com/astorije))
-- Rename "badge" setting and rely on browser choice for desktop notifications ([#28](https://github.com/thelounge/thelounge/pull/28) by [@lpoujol](https://github.com/lpoujol))
-- Invoke `handlebars` outside of `grunt` and generate a sourcemap ([#144](https://github.com/thelounge/thelounge/pull/144) by [@xPaw](https://github.com/xPaw))
-- Make `whois` a client action template and improve its output ([#161](https://github.com/thelounge/thelounge/pull/161) by [@xPaw](https://github.com/xPaw))
-- Handle commands in a better way and send unknown commands to the IRC server ([#154](https://github.com/thelounge/thelounge/pull/154) by [@xPaw](https://github.com/xPaw))
-- Switch the Send button to a paper plane icon ([#182](https://github.com/thelounge/thelounge/pull/182) by [@astorije](https://github.com/astorije))
-- Keep track of highlights when user is offline ([#190](https://github.com/thelounge/thelounge/pull/190) by [@xPaw](https://github.com/xPaw))
-- Load input plugins at startup and call them directly when a command is received ([#191](https://github.com/thelounge/thelounge/pull/191) by [@astorije](https://github.com/astorije))
-- Make defaults for socket.io transports consistent to use polling before websocket ([#202](https://github.com/thelounge/thelounge/pull/202) by [@xPaw](https://github.com/xPaw))
-- Update all server dependencies to current stable versions ([#200](https://github.com/thelounge/thelounge/pull/200) by [@xPaw](https://github.com/xPaw))
-- Update configuration file to reflect HTTP/2 support addition ([#206](https://github.com/thelounge/thelounge/pull/206) by [@astorije](https://github.com/astorije))
-- Change close button behavior and add a dropdown context menu ([#184](https://github.com/thelounge/thelounge/pull/184) by [@xPaw](https://github.com/xPaw))
-- Minor enhancements of the context menu UI ([#212](https://github.com/thelounge/thelounge/pull/212) by [@astorije](https://github.com/astorije))
+- Update Handlebars to 4.0.5 ([#140](https://github.com/thelounge/lounge/pull/140) by [@xPaw](https://github.com/xPaw))
+- Update Socket.IO to 1.4.5 and use client library provided by the dependency ([#142](https://github.com/thelounge/lounge/pull/142) by [@xPaw](https://github.com/xPaw))
+- Update ESLint to 2.3.0 and add stricter rules ([#171](https://github.com/thelounge/lounge/pull/171) by [@xPaw](https://github.com/xPaw))
+- Mute color of the topic actions ([#151](https://github.com/thelounge/lounge/pull/151) by [@astorije](https://github.com/astorije))
+- Rename "badge" setting and rely on browser choice for desktop notifications ([#28](https://github.com/thelounge/lounge/pull/28) by [@lpoujol](https://github.com/lpoujol))
+- Invoke `handlebars` outside of `grunt` and generate a sourcemap ([#144](https://github.com/thelounge/lounge/pull/144) by [@xPaw](https://github.com/xPaw))
+- Make `whois` a client action template and improve its output ([#161](https://github.com/thelounge/lounge/pull/161) by [@xPaw](https://github.com/xPaw))
+- Handle commands in a better way and send unknown commands to the IRC server ([#154](https://github.com/thelounge/lounge/pull/154) by [@xPaw](https://github.com/xPaw))
+- Switch the Send button to a paper plane icon ([#182](https://github.com/thelounge/lounge/pull/182) by [@astorije](https://github.com/astorije))
+- Keep track of highlights when user is offline ([#190](https://github.com/thelounge/lounge/pull/190) by [@xPaw](https://github.com/xPaw))
+- Load input plugins at startup and call them directly when a command is received ([#191](https://github.com/thelounge/lounge/pull/191) by [@astorije](https://github.com/astorije))
+- Make defaults for socket.io transports consistent to use polling before websocket ([#202](https://github.com/thelounge/lounge/pull/202) by [@xPaw](https://github.com/xPaw))
+- Update all server dependencies to current stable versions ([#200](https://github.com/thelounge/lounge/pull/200) by [@xPaw](https://github.com/xPaw))
+- Update configuration file to reflect HTTP/2 support addition ([#206](https://github.com/thelounge/lounge/pull/206) by [@astorije](https://github.com/astorije))
+- Change close button behavior and add a dropdown context menu ([#184](https://github.com/thelounge/lounge/pull/184) by [@xPaw](https://github.com/xPaw))
+- Minor enhancements of the context menu UI ([#212](https://github.com/thelounge/lounge/pull/212) by [@astorije](https://github.com/astorije))
### Removed
-- Remove `string.contains` library ([#163](https://github.com/thelounge/thelounge/pull/163) by [@xPaw](https://github.com/xPaw))
-- Remove Moment.js library from the client ([#183](https://github.com/thelounge/thelounge/pull/183) by [@xPaw](https://github.com/xPaw))
-- Disabled emails from Travis CI on successful builds ([#172](https://github.com/thelounge/thelounge/pull/172) by [@xPaw](https://github.com/xPaw))
-- Remove unnecessary operation when sorting users ([#193](https://github.com/thelounge/thelounge/pull/193) by [@astorije](https://github.com/astorije))
+- Remove `string.contains` library ([#163](https://github.com/thelounge/lounge/pull/163) by [@xPaw](https://github.com/xPaw))
+- Remove Moment.js library from the client ([#183](https://github.com/thelounge/lounge/pull/183) by [@xPaw](https://github.com/xPaw))
+- Disabled emails from Travis CI on successful builds ([#172](https://github.com/thelounge/lounge/pull/172) by [@xPaw](https://github.com/xPaw))
+- Remove unnecessary operation when sorting users ([#193](https://github.com/thelounge/lounge/pull/193) by [@astorije](https://github.com/astorije))
### Fixed
-- Make sure self messages are never highlighted and improve highlight lookup ([#157](https://github.com/thelounge/thelounge/pull/157) by [@astorije](https://github.com/astorije))
-- Fix Send button style on Zenburn and Morning themes, introduced by this release ([#187](https://github.com/thelounge/thelounge/pull/187) by [@astorije](https://github.com/astorije))
-- Make sure all close buttons in the sidebar have same weight ([#192](https://github.com/thelounge/thelounge/pull/192) by [@astorije](https://github.com/astorije))
-- Disallow parting from lobbies ([#209](https://github.com/thelounge/thelounge/pull/209) by [@xPaw](https://github.com/xPaw))
+- Make sure self messages are never highlighted and improve highlight lookup ([#157](https://github.com/thelounge/lounge/pull/157) by [@astorije](https://github.com/astorije))
+- Fix Send button style on Zenburn and Morning themes, introduced by this release ([#187](https://github.com/thelounge/lounge/pull/187) by [@astorije](https://github.com/astorije))
+- Make sure all close buttons in the sidebar have same weight ([#192](https://github.com/thelounge/lounge/pull/192) by [@astorije](https://github.com/astorije))
+- Disallow parting from lobbies ([#209](https://github.com/thelounge/lounge/pull/209) by [@xPaw](https://github.com/xPaw))
## v1.3.1 - 2016-03-05
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.3.0...v1.3.1)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.3.0...v1.3.1)
### Removed
-- Remove attempts to set file modes ([#117](https://github.com/thelounge/thelounge/pull/117) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Remove attempts to set file modes ([#117](https://github.com/thelounge/lounge/pull/117) by [@maxpoulin64](https://github.com/maxpoulin64))
### Fixed
-- Correctly handle inline channels in messages ([#128](https://github.com/thelounge/thelounge/pull/128) by [@xPaw](https://github.com/xPaw))
-- Fix crash, introduced by this release ([#143](https://github.com/thelounge/thelounge/pull/143) by [@xPaw](https://github.com/xPaw))
-- Fix highlighted actions and mute colors of some of the actions ([#47](https://github.com/thelounge/thelounge/pull/47) by [@xPaw](https://github.com/xPaw))
-- Fix stripping multiple colors from notifications ([#145](https://github.com/thelounge/thelounge/pull/145) by [@xPaw](https://github.com/xPaw))
-- Correctly display channel name in notifications ([#148](https://github.com/thelounge/thelounge/pull/148) by [@xPaw](https://github.com/xPaw))
-- Fix hover effect on channels in topics ([#149](https://github.com/thelounge/thelounge/pull/149) by [@xPaw](https://github.com/xPaw))
-- Add missing mode action to muted colors ([#150](https://github.com/thelounge/thelounge/pull/150) by [@astorije](https://github.com/astorije))
+- Correctly handle inline channels in messages ([#128](https://github.com/thelounge/lounge/pull/128) by [@xPaw](https://github.com/xPaw))
+- Fix crash, introduced by this release ([#143](https://github.com/thelounge/lounge/pull/143) by [@xPaw](https://github.com/xPaw))
+- Fix highlighted actions and mute colors of some of the actions ([#47](https://github.com/thelounge/lounge/pull/47) by [@xPaw](https://github.com/xPaw))
+- Fix stripping multiple colors from notifications ([#145](https://github.com/thelounge/lounge/pull/145) by [@xPaw](https://github.com/xPaw))
+- Correctly display channel name in notifications ([#148](https://github.com/thelounge/lounge/pull/148) by [@xPaw](https://github.com/xPaw))
+- Fix hover effect on channels in topics ([#149](https://github.com/thelounge/lounge/pull/149) by [@xPaw](https://github.com/xPaw))
+- Add missing mode action to muted colors ([#150](https://github.com/thelounge/lounge/pull/150) by [@astorije](https://github.com/astorije))
## v1.3.0 - 2016-03-03
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.2.1...v1.3.0)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.2.1...v1.3.0)
### Added
-- Add hostmask in `join`/`part`/`quit` messages and move actions to templates ([#94](https://github.com/thelounge/thelounge/pull/94) by [@xPaw](https://github.com/xPaw))
-- Add a section in the README explaining why a fork was created ([#95](https://github.com/thelounge/thelounge/pull/95) by [@almet](https://github.com/almet))
-- Add the ability to let users change their password from the settings page ([#57](https://github.com/thelounge/thelounge/pull/57) by [@diddledan](https://github.com/diddledan))
-- Add the ability to let users set custom CSS in their settings ([#83](https://github.com/thelounge/thelounge/pull/83) by [@xPaw](https://github.com/xPaw))
-- Add notifications for channel invites ([#127](https://github.com/thelounge/thelounge/pull/127) by [@astorije](https://github.com/astorije))
-- Allow locking network configuration ([#82](https://github.com/thelounge/thelounge/pull/82) by [@xPaw](https://github.com/xPaw))
+- Add hostmask in `join`/`part`/`quit` messages and move actions to templates ([#94](https://github.com/thelounge/lounge/pull/94) by [@xPaw](https://github.com/xPaw))
+- Add a section in the README explaining why a fork was created ([#95](https://github.com/thelounge/lounge/pull/95) by [@almet](https://github.com/almet))
+- Add the ability to let users change their password from the settings page ([#57](https://github.com/thelounge/lounge/pull/57) by [@diddledan](https://github.com/diddledan))
+- Add the ability to let users set custom CSS in their settings ([#83](https://github.com/thelounge/lounge/pull/83) by [@xPaw](https://github.com/xPaw))
+- Add notifications for channel invites ([#127](https://github.com/thelounge/lounge/pull/127) by [@astorije](https://github.com/astorije))
+- Allow locking network configuration ([#82](https://github.com/thelounge/lounge/pull/82) by [@xPaw](https://github.com/xPaw))
### Changed
-- Add target channel name in notifications ([#118](https://github.com/thelounge/thelounge/pull/118) by [@astorije](https://github.com/astorije))
-- Bump `grunt-contrib-uglify` and pin versions of `grunt`-related dependencies ([#119](https://github.com/thelounge/thelounge/pull/119) by [@astorije](https://github.com/astorije))
-- Switch to a power-off icon for logging out ([#131](https://github.com/thelounge/thelounge/pull/131) by [@astorije](https://github.com/astorije))
+- Add target channel name in notifications ([#118](https://github.com/thelounge/lounge/pull/118) by [@astorije](https://github.com/astorije))
+- Bump `grunt-contrib-uglify` and pin versions of `grunt`-related dependencies ([#119](https://github.com/thelounge/lounge/pull/119) by [@astorije](https://github.com/astorije))
+- Switch to a power-off icon for logging out ([#131](https://github.com/thelounge/lounge/pull/131) by [@astorije](https://github.com/astorije))
### Removed
-- Remove auto-select on input fields ([#120](https://github.com/thelounge/thelounge/pull/120) by [@astorije](https://github.com/astorije))
+- Remove auto-select on input fields ([#120](https://github.com/thelounge/lounge/pull/120) by [@astorije](https://github.com/astorije))
### Fixed
-- Fix the "Show more" button being displayed over chat messages and message paddings when `join`/`part`/`quit` messages are hidden ([`b53e5c4`](https://github.com/thelounge/thelounge/commit/b53e5c407c7ca90e9741791b4e0d927fb5f54ea1) by [@xPaw](https://github.com/xPaw))
-- Fix how highlights are handled and highlighted ([#91](https://github.com/thelounge/thelounge/pull/91) by [@xPaw](https://github.com/xPaw))
-- Fix favicon highlight on Chrome and remove `Favico.js` library ([#100](https://github.com/thelounge/thelounge/pull/100) by [@xPaw](https://github.com/xPaw))
-- Fix complete crash when refreshing a public instance, introduced by this release ([#125](https://github.com/thelounge/thelounge/pull/125) by [@astorije](https://github.com/astorije))
-- Fix clickable "you" in the text of an `/invite`, introduced by this release ([#122](https://github.com/thelounge/thelounge/pull/122) by [@xPaw](https://github.com/xPaw))
-- Fix minor issues with the main HTML file ([#134](https://github.com/thelounge/thelounge/pull/134) by [@astorije](https://github.com/astorije))
-- Strip control codes from notifications ([#123](https://github.com/thelounge/thelounge/pull/123) by [@xPaw](https://github.com/xPaw))
+- Fix the "Show more" button being displayed over chat messages and message paddings when `join`/`part`/`quit` messages are hidden ([`b53e5c4`](https://github.com/thelounge/lounge/commit/b53e5c407c7ca90e9741791b4e0d927fb5f54ea1) by [@xPaw](https://github.com/xPaw))
+- Fix how highlights are handled and highlighted ([#91](https://github.com/thelounge/lounge/pull/91) by [@xPaw](https://github.com/xPaw))
+- Fix favicon highlight on Chrome and remove `Favico.js` library ([#100](https://github.com/thelounge/lounge/pull/100) by [@xPaw](https://github.com/xPaw))
+- Fix complete crash when refreshing a public instance, introduced by this release ([#125](https://github.com/thelounge/lounge/pull/125) by [@astorije](https://github.com/astorije))
+- Fix clickable "you" in the text of an `/invite`, introduced by this release ([#122](https://github.com/thelounge/lounge/pull/122) by [@xPaw](https://github.com/xPaw))
+- Fix minor issues with the main HTML file ([#134](https://github.com/thelounge/lounge/pull/134) by [@astorije](https://github.com/astorije))
+- Strip control codes from notifications ([#123](https://github.com/thelounge/lounge/pull/123) by [@xPaw](https://github.com/xPaw))
## v1.2.1 - 2016-02-26
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.2.0...v1.2.1)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.2.0...v1.2.1)
### Changed
-- Bump and pin mocha version ([#104](https://github.com/thelounge/thelounge/pull/104) by [@astorije](https://github.com/astorije))
+- Bump and pin mocha version ([#104](https://github.com/thelounge/lounge/pull/104) by [@astorije](https://github.com/astorije))
### Fixed
-- Fix CSS selector syntax in channel message handler ([#102](https://github.com/thelounge/thelounge/pull/102) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Fix fading channel name in sidebar of Crypto and Zenburn themes ([#105](https://github.com/thelounge/thelounge/pull/105) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Fix `/invite` command broken by lodash bump ([#106](https://github.com/thelounge/thelounge/pull/106) by [@JocelynDelalande](https://github.com/JocelynDelalande))
+- Fix CSS selector syntax in channel message handler ([#102](https://github.com/thelounge/lounge/pull/102) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Fix fading channel name in sidebar of Crypto and Zenburn themes ([#105](https://github.com/thelounge/lounge/pull/105) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Fix `/invite` command broken by lodash bump ([#106](https://github.com/thelounge/lounge/pull/106) by [@JocelynDelalande](https://github.com/JocelynDelalande))
## v1.2.0 - 2016-02-24
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.1.1...v1.2.0)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.1.1...v1.2.0)
-Note that this release will reset client-side settings to their defaults. Current users will have to re-set them in the settings page. This is [a conscious trade-off](https://github.com/thelounge/thelounge/pull/70#issuecomment-186717859) as the fork is rather new and there are not many settings overall.
+Note that this release will reset client-side settings to their defaults. Current users will have to re-set them in the settings page. This is [a conscious trade-off](https://github.com/thelounge/lounge/pull/70#issuecomment-186717859) as the fork is rather new and there are not many settings overall.
### Added
-- Add support for the `/invite ` command ([#7](https://github.com/thelounge/thelounge/pull/7) by [@xPaw](https://github.com/xPaw))
-- Add a command shorthand to invite in the current channel with `/invite ` ([#76](https://github.com/thelounge/thelounge/pull/76) by [@astorije](https://github.com/astorije))
-- Add style linting for all CSS files in the repository ([#43](https://github.com/thelounge/thelounge/pull/43) by [@xPaw](https://github.com/xPaw))
+- Add support for the `/invite ` command ([#7](https://github.com/thelounge/lounge/pull/7) by [@xPaw](https://github.com/xPaw))
+- Add a command shorthand to invite in the current channel with `/invite ` ([#76](https://github.com/thelounge/lounge/pull/76) by [@astorije](https://github.com/astorije))
+- Add style linting for all CSS files in the repository ([#43](https://github.com/thelounge/lounge/pull/43) by [@xPaw](https://github.com/xPaw))
### Changed
-- Improve client performance by updating the users' list only when it's needed ([#58](https://github.com/thelounge/thelounge/pull/58) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Let the badge counter hide with a fade-out ([#73](https://github.com/thelounge/thelounge/pull/73) by [@xPaw](https://github.com/xPaw))
-- Update `lodash` dependency to the latest major version ([#38](https://github.com/thelounge/thelounge/pull/38) by [@xPaw](https://github.com/xPaw))
-- Use `localStorage` instead of cookies for client-side settings storage ([#70](https://github.com/thelounge/thelounge/pull/70) by [@xPaw](https://github.com/xPaw))
-- Replace Bootstrap's tooltips with CSS tooltips from GitHub's Primer ([#79](https://github.com/thelounge/thelounge/pull/79) by [@xPaw](https://github.com/xPaw))
+- Improve client performance by updating the users' list only when it's needed ([#58](https://github.com/thelounge/lounge/pull/58) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Let the badge counter hide with a fade-out ([#73](https://github.com/thelounge/lounge/pull/73) by [@xPaw](https://github.com/xPaw))
+- Update `lodash` dependency to the latest major version ([#38](https://github.com/thelounge/lounge/pull/38) by [@xPaw](https://github.com/xPaw))
+- Use `localStorage` instead of cookies for client-side settings storage ([#70](https://github.com/thelounge/lounge/pull/70) by [@xPaw](https://github.com/xPaw))
+- Replace Bootstrap's tooltips with CSS tooltips from GitHub's Primer ([#79](https://github.com/thelounge/lounge/pull/79) by [@xPaw](https://github.com/xPaw))
### Fixed
-- Fade long channel names in the sidebar instead of breaking to another line ([#75](https://github.com/thelounge/thelounge/pull/75) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Fade long channel names in the sidebar instead of breaking to another line ([#75](https://github.com/thelounge/lounge/pull/75) by [@maxpoulin64](https://github.com/maxpoulin64))
## v1.1.1 - 2016-02-19
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.1.0...v1.1.1)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.1.0...v1.1.1)
### Changed
-- Remove compiled assets and generate them at prepublish time ([#63](https://github.com/thelounge/thelounge/pull/63) by [@astorije](https://github.com/astorije))
+- Remove compiled assets and generate them at prepublish time ([#63](https://github.com/thelounge/lounge/pull/63) by [@astorije](https://github.com/astorije))
## v1.1.0 - 2016-02-19
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.0.2...v1.1.0)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.0.2...v1.1.0)
### Added
-- Allow The Lounge to be proxied behind a `/path/` URL ([#27](https://github.com/thelounge/thelounge/pull/27) by [@gdamjan](https://github.com/gdamjan))
+- Allow The Lounge to be proxied behind a `/path/` URL ([#27](https://github.com/thelounge/lounge/pull/27) by [@gdamjan](https://github.com/gdamjan))
### Changed
-- Simplify a great deal the CONTRIBUTING file ([#40](https://github.com/thelounge/thelounge/pull/40) by [@astorije](https://github.com/astorije))
-- Use a Font Awesome icon for the channel closing button ([#48](https://github.com/thelounge/thelounge/pull/48) by [@xPaw](https://github.com/xPaw))
+- Simplify a great deal the CONTRIBUTING file ([#40](https://github.com/thelounge/lounge/pull/40) by [@astorije](https://github.com/astorije))
+- Use a Font Awesome icon for the channel closing button ([#48](https://github.com/thelounge/lounge/pull/48) by [@xPaw](https://github.com/xPaw))
### Removed
-- Remove Node 0.10 from Travis CI ([#60](https://github.com/thelounge/thelounge/pull/60) by [@astorije](https://github.com/astorije))
+- Remove Node 0.10 from Travis CI ([#60](https://github.com/thelounge/lounge/pull/60) by [@astorije](https://github.com/astorije))
### Fixed
-- Suppress deprecation warning for `moment().zone` ([#37](https://github.com/thelounge/thelounge/pull/37) by [@deiu](https://github.com/deiu))
-- Fix a bug preventing the closing of a channel when the user was kicked out ([#34](https://github.com/thelounge/thelounge/pull/34) by [@xPaw](https://github.com/xPaw))
+- Suppress deprecation warning for `moment().zone` ([#37](https://github.com/thelounge/lounge/pull/37) by [@deiu](https://github.com/deiu))
+- Fix a bug preventing the closing of a channel when the user was kicked out ([#34](https://github.com/thelounge/lounge/pull/34) by [@xPaw](https://github.com/xPaw))
## v1.0.2 - 2016-02-15
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.0.1...v1.0.2)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.0.1...v1.0.2)
### Changed
-- Remove `#foo` channel from the default configuration file ([#22](https://github.com/thelounge/thelounge/pull/22) by [@astorije](https://github.com/astorije))
-- Change the Freenode URL to `chat.freenode.net` in the default configuration file ([#13](https://github.com/thelounge/thelounge/pull/13) by [@dubzi](https://github.com/dubzi))
-- Ensure all `.js` files are linted ([#42](https://github.com/thelounge/thelounge/pull/42) by [@williamboman](https://github.com/williamboman))
+- Remove `#foo` channel from the default configuration file ([#22](https://github.com/thelounge/lounge/pull/22) by [@astorije](https://github.com/astorije))
+- Change the Freenode URL to `chat.freenode.net` in the default configuration file ([#13](https://github.com/thelounge/lounge/pull/13) by [@dubzi](https://github.com/dubzi))
+- Ensure all `.js` files are linted ([#42](https://github.com/thelounge/lounge/pull/42) by [@williamboman](https://github.com/williamboman))
### Fixed
-- Hide the user list button on a server or private message window ([#32](https://github.com/thelounge/thelounge/pull/32) by [@MaxLeiter](https://github.com/MaxLeiter))
-- Correctly sort the user list whenever a user joins ([#33](https://github.com/thelounge/thelounge/pull/33) by [@xPaw](https://github.com/xPaw))
+- Hide the user list button on a server or private message window ([#32](https://github.com/thelounge/lounge/pull/32) by [@MaxLeiter](https://github.com/MaxLeiter))
+- Correctly sort the user list whenever a user joins ([#33](https://github.com/thelounge/lounge/pull/33) by [@xPaw](https://github.com/xPaw))
## v1.0.1 - 2016-02-14
-[See the full changelog](https://github.com/thelounge/thelounge/compare/v1.0.0...v1.0.1)
+[See the full changelog](https://github.com/thelounge/lounge/compare/v1.0.0...v1.0.1)
### Changed
-- In the change log, use a permanent URL to link the previous history of The Lounge to Shout ([#12](https://github.com/thelounge/thelounge/pull/12) by [@xPaw](https://github.com/xPaw))
-- Update some dependencies and pin versions ([#8](https://github.com/thelounge/thelounge/pull/8) by [@xPaw](https://github.com/xPaw))
+- In the change log, use a permanent URL to link the previous history of The Lounge to Shout ([#12](https://github.com/thelounge/lounge/pull/12) by [@xPaw](https://github.com/xPaw))
+- Update some dependencies and pin versions ([#8](https://github.com/thelounge/lounge/pull/8) by [@xPaw](https://github.com/xPaw))
### Fixed
-- Add missing form methods that were causing LastPass to trigger a warning ([#19](https://github.com/thelounge/thelounge/pull/19) by [@maxpoulin64](https://github.com/maxpoulin64))
-- Fix comments in the configuration file ([#1](https://github.com/thelounge/thelounge/pull/1) by [@FryDay](https://github.com/FryDay))
+- Add missing form methods that were causing LastPass to trigger a warning ([#19](https://github.com/thelounge/lounge/pull/19) by [@maxpoulin64](https://github.com/maxpoulin64))
+- Fix comments in the configuration file ([#1](https://github.com/thelounge/lounge/pull/1) by [@FryDay](https://github.com/FryDay))
## v1.0.0 - 2016-02-12
-[See the full changelog](https://github.com/thelounge/thelounge/compare/baadc3df3534fb22515a8c2ea29218fbbc1228b4...v1.0.0)
+[See the full changelog](https://github.com/thelounge/lounge/compare/baadc3df3534fb22515a8c2ea29218fbbc1228b4...v1.0.0)
This is the first release of **The Lounge**, picking up where Shout `v0.53.0` left off!
@@ -4595,7 +547,7 @@ This is the first release of **The Lounge**, picking up where Shout `v0.53.0` le
- Render user actions separately ([#588](https://github.com/erming/shout/pull/588) by [@xPaw](https://github.com/xPaw))
- Simply parse all 0-99 IRC colors ([#609](https://github.com/erming/shout/pull/609) by [@xPaw](https://github.com/xPaw))
- Tag notifications to reduce notification spam ([#418](https://github.com/erming/shout/pull/418) by [@williamboman](https://github.com/williamboman))
-- Change all mentions of Shout to the new name: The Lounge ([#2](https://github.com/thelounge/thelounge/pull/2) by [@astorije](https://github.com/astorije))
+- Change all mentions of Shout to the new name: The Lounge ([#2](https://github.com/thelounge/lounge/pull/2) by [@astorije](https://github.com/astorije))
### Fixed
diff --git a/.github/CONTRIBUTING.md b/CONTRIBUTING.md
similarity index 57%
rename from .github/CONTRIBUTING.md
rename to CONTRIBUTING.md
index 4f18191e..f3da308a 100644
--- a/.github/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -3,20 +3,24 @@
Welcome to The Lounge, it's great to have you here! We thank you in advance for
your contributions.
+### I have a question
+
+- Find us on the Freenode channel `#thelounge`. You might not get an answer
+ right away, but this channel is full of nice people who will be happy to
+ help you.
+
### I want to report a bug
- Look at the [open and closed
- issues](https://github.com/thelounge/thelounge/issues?q=is%3Aissue) to see if
+ issues](https://github.com/thelounge/lounge/issues?q=is%3Aissue) to see if
this was not already discussed before. If you can't see any, feel free to
- [open a new issue](https://github.com/thelounge/thelounge/issues/new).
-- If you think you discovered a security vulnerability, **do not open a public
- issue on GitHub.** Refer to our [security guidelines](/SECURITY.md) instead.
+ [open a new issue](https://github.com/thelounge/lounge/issues/new).
### I want to contribute to the code
- Make sure to discuss your ideas with the community in an
- [issue](https://github.com/thelounge/thelounge/issues) or on the IRC channel.
-- Take a look at the open issues labeled as [`help wanted`](https://github.com/thelounge/thelounge/labels/help%20wanted)
+ [issue](https://github.com/thelounge/lounge/issues) or on the IRC channel.
+- Take a look at the open issues labeled as [`help wanted`](https://github.com/thelounge/lounge/issues?q=is%3Aopen+is%3Aissue+label%3Abug+label%3A%22help+wanted%22)
if you want to help without having a specific idea in mind.
- Make sure that your PRs do not contain unnecessary commits or merge commits.
[Squash commits](https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History)
@@ -28,10 +32,6 @@ your contributions.
Pope's guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).
- Each PR will be reviewed by at least two different project maintainers. You
can read more about this in the [maintainers'
- corner](https://github.com/thelounge/thelounge/wiki/Maintainers'-corner).
+corner](https://github.com/thelounge/lounge/wiki/Maintainers'-corner).
- Please document any relevant changes in the documentation that can be found
- [in its own repository](https://github.com/thelounge/thelounge.chat).
-- Note that we use prettier on the project. You can set up IDE plugins to format
- on save ([see VS Code one here](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)).
-- We have a git hook to automatically run prettier before commit, in case you don't install the plugin.
-- If for any reason, prettier does not work for you, you can run `yarn format:prettier` and that should format everything.
+ [in its own repository](https://github.com/thelounge/thelounge.github.io).
diff --git a/Gruntfile.js b/Gruntfile.js
new file mode 100644
index 00000000..49f9477b
--- /dev/null
+++ b/Gruntfile.js
@@ -0,0 +1,26 @@
+module.exports = function(grunt) {
+ var libs = "client/js/libs/**/*.js";
+ grunt.initConfig({
+ watch: {
+ files: libs,
+ tasks: ["uglify"]
+ },
+ uglify: {
+ options: {
+ sourceMap: true,
+ compress: false
+ },
+ js: {
+ files: {
+ "client/js/libs.min.js": libs
+ }
+ }
+ }
+ });
+ grunt.loadNpmTasks("grunt-contrib-uglify");
+ grunt.loadNpmTasks("grunt-contrib-watch");
+ grunt.registerTask(
+ "default",
+ ["uglify"]
+ );
+};
diff --git a/README.md b/README.md
index 20ca44f5..cc9ae834 100644
--- a/README.md
+++ b/README.md
@@ -1,95 +1,75 @@
-
-
-
+[](https://avatar.playat.ch:1000/)
+[](https://www.npmjs.org/package/thelounge)
+[](https://travis-ci.org/thelounge/lounge)
+[](https://ci.appveyor.com/project/astorije/lounge/branch/master)
+[](https://david-dm.org/thelounge/lounge)
+[](https://david-dm.org/thelounge/lounge#info=devDependencies)
-
- Modern web IRC client designed for self-hosting
-
+# The Lounge
-
-
- Website
- •
- Docs
- •
- Demo
- •
- Docker
-
-
-
-
-
-
-
+__What is it?__
-
-
-
+The Lounge is a web IRC client that you host on your own server.
-## Overview
+*This is the official, community-managed fork of @erming's great initiative, the [Shout](https://github.com/erming/shout) project.*
-- **Modern features brought to IRC.** Push notifications, link previews, new message markers, and more bring IRC to the 21st century.
-- **Always connected.** Remains connected to IRC servers while you are offline.
-- **Cross platform.** It doesn't matter what OS you use, it just works wherever Node.js runs.
-- **Responsive interface.** The client works smoothly on every desktop, smartphone and tablet.
-- **Synchronized experience.** Always resume where you left off no matter what device.
+__What features does it have?__
-To learn more about configuration, usage and features of The Lounge, take a look at [the website](https://thelounge.chat).
+- Multiple user support
+- Stays connected even when you close the browser
+- Connect from multiple devices at once
+- Responsive layout — works well on your smartphone
+- _.. and more!_
-The Lounge is the official and community-managed fork of [Shout](https://github.com/erming/shout), by [Mattias Erming](https://github.com/erming).
+__Why the fork?__
-## Installation and usage
+We felt that the original [Shout](https://github.com/erming/shout) project
+"stagnated" a little because its original author wanted it to remain his pet
+project (which is a perfectly fine thing!).
-The Lounge requires latest [Node.js](https://nodejs.org/) LTS version or more recent.
-The [Yarn package manager](https://yarnpkg.com/) is also recommended.
-If you want to install with npm, `--unsafe-perm` is required for a correct install.
+A bunch of people, excited about doing things a bit differently than the upstream
+project forked it under a new name: “The Lounge”.
-### Running stable releases
+This fork aims to be community managed, meaning that the decisions are taken
+in a collegial fashion, and that a bunch of maintainers should be able to make
+the review process quicker and more streamlined.
-Please refer to the [install and upgrade documentation on our website](https://thelounge.chat/docs/install-and-upgrade) for all available installation methods.
+## Install
-### Running from source
+To use The Lounge you must have [Node.js](https://nodejs.org/en/download/) installed.
+The oldest Node.js version we support is 4.2.0.
-The following commands install and run the development version of The Lounge:
+If you still use 0.10 or 0.12 we strongly advise you to upgrade before installing The Lounge.
+For more information on how to upgrade, read the [documentation](https://nodejs.org/en/download/package-manager/).
-```sh
-git clone https://github.com/thelounge/thelounge.git
-cd thelounge
-yarn install
-NODE_ENV=production yarn build
-yarn start
+```
+sudo npm install -g thelounge
```
-When installed like this, `thelounge` executable is not created. Use `node index ` to run commands.
+## Usage
-⚠️ While it is the most recent codebase, this is not production-ready! Run at
-your own risk. It is also not recommended to run this as root.
+When the install is complete, go ahead and run this in your terminal:
+
+```
+lounge --help
+```
+
+For more information, read the [documentation](https://thelounge.github.io/docs/).
## Development setup
-Simply follow the instructions to run The Lounge from source above, on your own
-fork.
+To run the app from source, just clone the code and run this in your terminal:
-Before submitting any change, make sure to:
+```
+npm install
+npm start
+```
-- Read the [Contributing instructions](https://github.com/thelounge/thelounge/blob/master/.github/CONTRIBUTING.md#contributing)
-- Run `yarn test` to execute linters and the test suite
- - Run `yarn format:prettier` if linting fails
-- Run `yarn build:client` if you change or add anything in `client/js` or `client/components`
- - The built files will be output to `public/` by webpack
-- Run `yarn build:server` if you change anything in `server/`
- - The built files will be output to `dist/` by tsc
-- `yarn dev` can be used to start The Lounge with hot module reloading
+You will have to run `npm run build` if you change or add anything in
+`client/js/libs` or `client/views`.
-To ensure that you don't commit files that fail the linting, you can install a pre-commit git hook.
-Execute `yarn githooks-install` to do so.
+## License
+
+Available under the [MIT License](LICENSE).
+
+Some fonts licensed under [SIL OFL](http://scripts.sil.org/OFL) and the [Apache License](http://www.apache.org/licenses/).
diff --git a/SECURITY.md b/SECURITY.md
deleted file mode 100644
index 7c292045..00000000
--- a/SECURITY.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# Responsible Disclosure of Security Vulnerabilities
-
-- ⚠️ **Do not open public issues on GitHub to report security vulnerabilities.**
-- Contact us privately first, in a
- [responsible disclosure](https://en.wikipedia.org/wiki/Responsible_disclosure)
- manner.
-- On IRC, send a private message to any voiced user on our Libera.Chat channel,
- `#thelounge`.
-- By email, send us your report at .
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 00000000..4e0b2fc8
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,29 @@
+---
+# http://www.appveyor.com/docs/appveyor-yml
+
+# Build version format
+version: "{build}"
+
+# Do not build on tags (GitHub only)
+skip_tags: true
+
+environment:
+ nodejs_version: '4'
+
+install:
+ - ps: Install-Product node $env:nodejs_version
+ - npm install
+ - npm install mocha-appveyor-reporter
+ - echo --reporter mocha-appveyor-reporter >> test/mocha.opts
+
+test_script:
+ - node --version
+ - npm --version
+ - npm test
+
+# cache npm modules
+cache:
+ - node_modules
+
+# Don't actually build
+build: off
diff --git a/babel.config.cjs b/babel.config.cjs
deleted file mode 100644
index 8554cbc5..00000000
--- a/babel.config.cjs
+++ /dev/null
@@ -1,4 +0,0 @@
-module.exports = {
- presets: [["@babel/preset-env", {bugfixes: true}], "babel-preset-typescript-vue3"],
- plugins: ["@babel/plugin-transform-runtime"],
-};
diff --git a/client/audio/pop.ogg b/client/audio/pop.ogg
new file mode 100644
index 00000000..1fe623f5
Binary files /dev/null and b/client/audio/pop.ogg differ
diff --git a/client/audio/pop.wav b/client/audio/pop.wav
deleted file mode 100644
index 07111c7e..00000000
Binary files a/client/audio/pop.wav and /dev/null differ
diff --git a/client/components/App.vue b/client/components/App.vue
deleted file mode 100644
index 9ae4190f..00000000
--- a/client/components/App.vue
+++ /dev/null
@@ -1,195 +0,0 @@
-
-
-
-
-
diff --git a/client/components/Channel.vue b/client/components/Channel.vue
deleted file mode 100644
index c21e55d2..00000000
--- a/client/components/Channel.vue
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
- {{ channel.name }}
- {{ unreadCount }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/components/ChannelWrapper.vue b/client/components/ChannelWrapper.vue
deleted file mode 100644
index 380b52af..00000000
--- a/client/components/ChannelWrapper.vue
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/client/components/Chat.vue b/client/components/Chat.vue
deleted file mode 100644
index b1447ed6..00000000
--- a/client/components/Chat.vue
+++ /dev/null
@@ -1,274 +0,0 @@
-
-
-
-
- {{ store.state.currentUserVisibleError }}
-
-
-
-
-
-
diff --git a/client/components/ChatInput.vue b/client/components/ChatInput.vue
deleted file mode 100644
index 8cc2f8ed..00000000
--- a/client/components/ChatInput.vue
+++ /dev/null
@@ -1,358 +0,0 @@
-
-
-
-
-
diff --git a/client/components/ChatUserList.vue b/client/components/ChatUserList.vue
deleted file mode 100644
index ffd5fb39..00000000
--- a/client/components/ChatUserList.vue
+++ /dev/null
@@ -1,255 +0,0 @@
-
-
-
-
-
diff --git a/client/components/ConfirmDialog.vue b/client/components/ConfirmDialog.vue
deleted file mode 100644
index 17691cad..00000000
--- a/client/components/ConfirmDialog.vue
+++ /dev/null
@@ -1,102 +0,0 @@
-
-
-
-
-
{{ data?.title }}
-
{{ data?.text }}
-
-
- Cancel
- {{ data?.button }}
-
-
-
-
-
-
-
-
diff --git a/client/components/ContextMenu.vue b/client/components/ContextMenu.vue
deleted file mode 100644
index 6a87fcc6..00000000
--- a/client/components/ContextMenu.vue
+++ /dev/null
@@ -1,286 +0,0 @@
-
-
-
-
-
diff --git a/client/components/DateMarker.vue b/client/components/DateMarker.vue
deleted file mode 100644
index 4125465c..00000000
--- a/client/components/DateMarker.vue
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
-
diff --git a/client/components/Draggable.vue b/client/components/Draggable.vue
deleted file mode 100644
index 065662fd..00000000
--- a/client/components/Draggable.vue
+++ /dev/null
@@ -1,120 +0,0 @@
-
-
-
-
-
-
-
diff --git a/client/components/ImageViewer.vue b/client/components/ImageViewer.vue
deleted file mode 100644
index 4a143372..00000000
--- a/client/components/ImageViewer.vue
+++ /dev/null
@@ -1,478 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/components/InlineChannel.vue b/client/components/InlineChannel.vue
deleted file mode 100644
index 784a93ad..00000000
--- a/client/components/InlineChannel.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
diff --git a/client/components/JoinChannel.vue b/client/components/JoinChannel.vue
deleted file mode 100644
index fa5eebc4..00000000
--- a/client/components/JoinChannel.vue
+++ /dev/null
@@ -1,93 +0,0 @@
-
-
-
-
- Join
-
-
-
-
diff --git a/client/components/LinkPreview.vue b/client/components/LinkPreview.vue
deleted file mode 100644
index 9a124ab8..00000000
--- a/client/components/LinkPreview.vue
+++ /dev/null
@@ -1,329 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- This image is larger than {{ imageMaxSize }} and cannot be previewed.
- Click here
- to open it in a new window.
-
-
-
-
- A preview could not be loaded.
- Click here
- to open it in a new window.
-
-
-
{{ link.message }}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/components/LinkPreviewFileSize.vue b/client/components/LinkPreviewFileSize.vue
deleted file mode 100644
index 5c577c1b..00000000
--- a/client/components/LinkPreviewFileSize.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-
- ({{ previewSize }})
-
-
-
diff --git a/client/components/LinkPreviewToggle.vue b/client/components/LinkPreviewToggle.vue
deleted file mode 100644
index 24351ab7..00000000
--- a/client/components/LinkPreviewToggle.vue
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
diff --git a/client/components/Mentions.vue b/client/components/Mentions.vue
deleted file mode 100644
index 63144948..00000000
--- a/client/components/Mentions.vue
+++ /dev/null
@@ -1,247 +0,0 @@
-
-
-
-
-
-
-
diff --git a/client/components/Message.vue b/client/components/Message.vue
deleted file mode 100644
index 44680ac0..00000000
--- a/client/components/Message.vue
+++ /dev/null
@@ -1,173 +0,0 @@
-
-
-
{{ `${messageTime} ` }}
-
-
- [{{ message.command }}]
-
- {{
- ` ${param} `
- }}
-
-
-
- ***
-
-
-
- *
-
-
-
-
-
-
-
-
- <
-
- >
-
-
-
-
- [
- {{ message.from.nick }}
- ]
-
-
-
-
- -
-
- -
-
-
-
-
- {{ message.statusmsgGroup }}
-
-
-
-
-
-
-
-
diff --git a/client/components/MessageCondensed.vue b/client/components/MessageCondensed.vue
deleted file mode 100644
index 218fdeff..00000000
--- a/client/components/MessageCondensed.vue
+++ /dev/null
@@ -1,165 +0,0 @@
-
-
-
-
-
- {{ condensedText
- }}
-
-
-
-
-
-
diff --git a/client/components/MessageList.vue b/client/components/MessageList.vue
deleted file mode 100644
index 2a2afe1b..00000000
--- a/client/components/MessageList.vue
+++ /dev/null
@@ -1,440 +0,0 @@
-
-
-
-
- Loading…
- Show older messages
-
-
-
-
-
-
-
diff --git a/client/components/MessageSearchForm.vue b/client/components/MessageSearchForm.vue
deleted file mode 100644
index 98b1a0b2..00000000
--- a/client/components/MessageSearchForm.vue
+++ /dev/null
@@ -1,175 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/components/MessageTypes/away.vue b/client/components/MessageTypes/away.vue
deleted file mode 100644
index 39ca76d1..00000000
--- a/client/components/MessageTypes/away.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
- is away
- ( )
-
-
-
-
-
diff --git a/client/components/MessageTypes/back.vue b/client/components/MessageTypes/back.vue
deleted file mode 100644
index 759d1e33..00000000
--- a/client/components/MessageTypes/back.vue
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
- is back
-
-
-
-
-
diff --git a/client/components/MessageTypes/chghost.vue b/client/components/MessageTypes/chghost.vue
deleted file mode 100644
index 0f6cd8f4..00000000
--- a/client/components/MessageTypes/chghost.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
- has changed
- username to {{ message.new_ident }}
- hostname to
-
-
-
-
-
diff --git a/client/components/MessageTypes/ctcp.vue b/client/components/MessageTypes/ctcp.vue
deleted file mode 100644
index 7b85afc3..00000000
--- a/client/components/MessageTypes/ctcp.vue
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
- {{ ` ` }}
-
-
-
-
diff --git a/client/components/MessageTypes/ctcp_request.vue b/client/components/MessageTypes/ctcp_request.vue
deleted file mode 100644
index 310bfacd..00000000
--- a/client/components/MessageTypes/ctcp_request.vue
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- sent a CTCP request:
-
-
-
-
-
diff --git a/client/components/MessageTypes/error.vue b/client/components/MessageTypes/error.vue
deleted file mode 100644
index 64b7f645..00000000
--- a/client/components/MessageTypes/error.vue
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
-
-
-
diff --git a/client/components/MessageTypes/index.ts b/client/components/MessageTypes/index.ts
deleted file mode 100644
index 412bcfbc..00000000
--- a/client/components/MessageTypes/index.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-// This creates a version of `require()` in the context of the current
-// directory, so we iterate over its content, which is a map statically built by
-// Webpack.
-// Second argument says it's recursive, third makes sure we only load templates.
-const requireViews = require.context(".", false, /\.vue$/);
-
-export default requireViews.keys().reduce((acc: Record, path) => {
- acc["message-" + path.substring(2, path.length - 4)] = requireViews(path).default;
-
- return acc;
-}, {});
diff --git a/client/components/MessageTypes/invite.vue b/client/components/MessageTypes/invite.vue
deleted file mode 100644
index 62c9f989..00000000
--- a/client/components/MessageTypes/invite.vue
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
- invited
- you
-
- to
-
-
-
-
diff --git a/client/components/MessageTypes/join.vue b/client/components/MessageTypes/join.vue
deleted file mode 100644
index 6d80b0ab..00000000
--- a/client/components/MessageTypes/join.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
- ( )
-
- [{{ message.account }}]
-
-
- ({{ message.gecos }})
-
- has joined the channel
-
-
-
-
diff --git a/client/components/MessageTypes/kick.vue b/client/components/MessageTypes/kick.vue
deleted file mode 100644
index fa312595..00000000
--- a/client/components/MessageTypes/kick.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
- has kicked
-
- ( )
-
-
-
-
diff --git a/client/components/MessageTypes/mode.vue b/client/components/MessageTypes/mode.vue
deleted file mode 100644
index 08fac02a..00000000
--- a/client/components/MessageTypes/mode.vue
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- sets mode
-
-
-
-
-
diff --git a/client/components/MessageTypes/mode_channel.vue b/client/components/MessageTypes/mode_channel.vue
deleted file mode 100644
index f79c9990..00000000
--- a/client/components/MessageTypes/mode_channel.vue
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
- Channel mode is {{ message.text }}
-
-
-
-
diff --git a/client/components/MessageTypes/mode_user.vue b/client/components/MessageTypes/mode_user.vue
deleted file mode 100644
index a4ec7d01..00000000
--- a/client/components/MessageTypes/mode_user.vue
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
- Your user mode is {{ message.raw_modes }}
-
-
-
-
diff --git a/client/components/MessageTypes/monospace_block.vue b/client/components/MessageTypes/monospace_block.vue
deleted file mode 100644
index a1d29b1a..00000000
--- a/client/components/MessageTypes/monospace_block.vue
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
diff --git a/client/components/MessageTypes/nick.vue b/client/components/MessageTypes/nick.vue
deleted file mode 100644
index b79b2a03..00000000
--- a/client/components/MessageTypes/nick.vue
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
- is now known as
-
-
-
-
-
diff --git a/client/components/MessageTypes/part.vue b/client/components/MessageTypes/part.vue
deleted file mode 100644
index d889a166..00000000
--- a/client/components/MessageTypes/part.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
- ( ) has
- left the channel
- ( )
-
-
-
-
diff --git a/client/components/MessageTypes/quit.vue b/client/components/MessageTypes/quit.vue
deleted file mode 100644
index 810127ac..00000000
--- a/client/components/MessageTypes/quit.vue
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
- ( ) has
- quit
- ( )
-
-
-
-
diff --git a/client/components/MessageTypes/raw.vue b/client/components/MessageTypes/raw.vue
deleted file mode 100644
index a324a5ad..00000000
--- a/client/components/MessageTypes/raw.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-
- {{ message.text }}
-
-
-
diff --git a/client/components/MessageTypes/topic.vue b/client/components/MessageTypes/topic.vue
deleted file mode 100644
index 4e32c6e5..00000000
--- a/client/components/MessageTypes/topic.vue
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
- has changed the topic to:
-
- The topic is:
-
-
-
-
-
diff --git a/client/components/MessageTypes/topic_set_by.vue b/client/components/MessageTypes/topic_set_by.vue
deleted file mode 100644
index e077ad0f..00000000
--- a/client/components/MessageTypes/topic_set_by.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
- Topic set by
-
- on {{ messageTimeLocale }}
-
-
-
-
diff --git a/client/components/MessageTypes/whois.vue b/client/components/MessageTypes/whois.vue
deleted file mode 100644
index 6d2c797f..00000000
--- a/client/components/MessageTypes/whois.vue
+++ /dev/null
@@ -1,150 +0,0 @@
-
-
-
-
- is offline, last information:
-
-
-
-
- Logged in as:
- {{ message.whois.account }}
-
-
- Host mask:
-
-
-
-
-
- Actual host:
-
- {{ message.whois.actual_ip }}
-
- ({{ message.whois.actual_hostname }})
-
-
-
-
- Actual username:
- {{ message.whois.actual_username }}
-
-
-
- Real name:
-
-
-
-
- Registered nick:
- {{ message.whois.registered_nick }}
-
-
-
- Channels:
-
-
-
-
- Modes:
- {{ message.whois.modes }}
-
-
-
-
- Special:
- {{ special }}
-
-
-
-
- Operator:
- {{ message.whois.operator }}
-
-
-
- Available for help:
- Yes
-
-
-
- Is a bot:
- Yes
-
-
-
- Away:
-
-
-
-
- Secure connection:
- Yes
-
-
-
-
- Certificate:
- {{ certfp }}
-
-
-
-
- Connected to:
-
- {{ message.whois.server }} ({{ message.whois.server_info }})
-
-
-
-
- Connected at:
- {{ localetime(message.whois.logonTime) }}
-
-
-
- Idle since:
- {{ localetime(message.whois.idleTime) }}
-
-
-
-
-
-
diff --git a/client/components/NetworkForm.vue b/client/components/NetworkForm.vue
deleted file mode 100644
index 87aca0b0..00000000
--- a/client/components/NetworkForm.vue
+++ /dev/null
@@ -1,572 +0,0 @@
-
-
-
-
-
-
-
diff --git a/client/components/NetworkList.vue b/client/components/NetworkList.vue
deleted file mode 100644
index 659af67f..00000000
--- a/client/components/NetworkList.vue
+++ /dev/null
@@ -1,576 +0,0 @@
-
-
- You are not connected to any networks yet.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/components/NetworkLobby.vue b/client/components/NetworkLobby.vue
deleted file mode 100644
index a2c08660..00000000
--- a/client/components/NetworkLobby.vue
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
-
-
-
-
- {{ channel.name }}
-
-
-
-
-
-
- {{
- unreadCount
- }}
-
-
-
-
-
-
-
-
diff --git a/client/components/ParsedMessage.vue b/client/components/ParsedMessage.vue
deleted file mode 100644
index 95311a09..00000000
--- a/client/components/ParsedMessage.vue
+++ /dev/null
@@ -1,22 +0,0 @@
-
diff --git a/client/components/RevealPassword.vue b/client/components/RevealPassword.vue
deleted file mode 100644
index fcc2f804..00000000
--- a/client/components/RevealPassword.vue
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/client/components/RoutedChat.vue b/client/components/RoutedChat.vue
deleted file mode 100644
index 21452e1d..00000000
--- a/client/components/RoutedChat.vue
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
-
diff --git a/client/components/Session.vue b/client/components/Session.vue
deleted file mode 100644
index f827d43c..00000000
--- a/client/components/Session.vue
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-
-
{{ session.agent }}
-
-
{{
- session.ip
- }}
-
-
- Active in {{ session.active }} browsers
-
-
- Last used on {{ lastUse }}
-
-
-
-
- Sign out
- Revoke
-
-
-
-
-
-
-
-
diff --git a/client/components/Settings/Account.vue b/client/components/Settings/Account.vue
deleted file mode 100644
index 07f836ef..00000000
--- a/client/components/Settings/Account.vue
+++ /dev/null
@@ -1,197 +0,0 @@
-
-
-
-
Change password
-
- Enter current password
-
-
-
-
-
- Enter desired new password
-
-
-
-
-
- Repeat new password
-
-
-
-
-
- Successfully updated your password
-
-
- {{ passwordErrors[passwordChangeStatus.error] }}
-
-
-
- Change password
-
-
-
-
-
-
Sessions
-
-
Current session
-
-
-
- Active sessions
-
-
-
-
Other sessions
-
Loading…
-
- You are not currently logged in to any other device.
-
-
-
-
-
-
-
diff --git a/client/components/Settings/Appearance.vue b/client/components/Settings/Appearance.vue
deleted file mode 100644
index 529c0272..00000000
--- a/client/components/Settings/Appearance.vue
+++ /dev/null
@@ -1,179 +0,0 @@
-
-
-
-
-
-
-
diff --git a/client/components/Settings/General.vue b/client/components/Settings/General.vue
deleted file mode 100644
index 9482554a..00000000
--- a/client/components/Settings/General.vue
+++ /dev/null
@@ -1,175 +0,0 @@
-
-
-
-
Native app
-
- Add The Lounge to Home screen
-
-
- Open irc:// URLs with The Lounge
-
-
-
-
File uploads
-
-
-
- Attempt to remove metadata from images before uploading
-
-
-
-
-
-
-
-
Settings synchronisation
-
-
- Synchronize settings with other clients
-
-
-
-
- Warning: Checking this box will override the settings of
- this client with those stored on the server.
-
-
- Use the button below to enable synchronization, and override any settings
- already synced to the server.
-
-
- Sync settings and enable
-
-
-
-
- Warning: No settings have been synced before. Enabling this
- will sync all settings of this client as the base for other clients.
-
-
-
-
-
-
Automatic away message
-
-
- Automatic away message
-
-
-
-
-
-
-
-
-
diff --git a/client/components/Settings/Navigation.vue b/client/components/Settings/Navigation.vue
deleted file mode 100644
index 1b8c5f39..00000000
--- a/client/components/Settings/Navigation.vue
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/client/components/Settings/Notifications.vue b/client/components/Settings/Notifications.vue
deleted file mode 100644
index 4599c7c0..00000000
--- a/client/components/Settings/Notifications.vue
+++ /dev/null
@@ -1,188 +0,0 @@
-
-
-
- Push Notifications
-
-
-
- Unsubscribe from push notifications
-
-
- Loading…
-
- Subscribe to push notifications
-
-
- Warning : Push notifications are only supported over HTTPS
- connections.
-
-
- Warning :
- Push notifications are not supported by your browser.
-
-
-
-
-
Browser Notifications
-
-
-
- Enable browser notifications
-
- Warning : Notifications are not supported by your browser.
-
-
- Warning : Notifications are only supported over HTTPS
- connections.
-
-
- Warning : Notifications are blocked by your browser.
-
-
-
-
-
-
- Enable notification sound
-
-
-
-
-
-
-
- Enable notification for all messages
-
-
-
-
-
-
- Custom highlights
-
-
-
-
-
-
-
-
-
-
-
- Highlight exceptions
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/components/Settings/SettingTabItem.vue b/client/components/Settings/SettingTabItem.vue
deleted file mode 100644
index 6512db61..00000000
--- a/client/components/Settings/SettingTabItem.vue
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
- {{ name }}
-
-
-
-
-
-
diff --git a/client/components/Sidebar.vue b/client/components/Sidebar.vue
deleted file mode 100644
index bc6abfbd..00000000
--- a/client/components/Sidebar.vue
+++ /dev/null
@@ -1,269 +0,0 @@
-
-
-
-
-
diff --git a/client/components/SidebarToggle.vue b/client/components/SidebarToggle.vue
deleted file mode 100644
index c260cac7..00000000
--- a/client/components/SidebarToggle.vue
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
diff --git a/client/components/Special/ListBans.vue b/client/components/Special/ListBans.vue
deleted file mode 100644
index b9c6a528..00000000
--- a/client/components/Special/ListBans.vue
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
- Banned
- Banned By
- Banned At
-
-
-
-
-
- {{ ban.banned_by }}
- {{ localetime(ban.banned_at) }}
-
-
-
-
-
-
diff --git a/client/components/Special/ListChannels.vue b/client/components/Special/ListChannels.vue
deleted file mode 100644
index fcc188e9..00000000
--- a/client/components/Special/ListChannels.vue
+++ /dev/null
@@ -1,36 +0,0 @@
-
- {{ channel.data.text }}
-
-
-
- Channel
- Users
- Topic
-
-
-
-
-
- {{ chan.num_users }}
-
-
-
-
-
-
-
diff --git a/client/components/Special/ListIgnored.vue b/client/components/Special/ListIgnored.vue
deleted file mode 100644
index 4ea399de..00000000
--- a/client/components/Special/ListIgnored.vue
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-
-
- Hostmask
- Ignored At
-
-
-
-
-
- {{ localetime(user.when) }}
-
-
-
-
-
-
diff --git a/client/components/Special/ListInvites.vue b/client/components/Special/ListInvites.vue
deleted file mode 100644
index c04a83a5..00000000
--- a/client/components/Special/ListInvites.vue
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
- Invited
- Invited By
- Invited At
-
-
-
-
-
-
-
- {{ invite.invited_by }}
- {{ localetime(invite.invited_at) }}
-
-
-
-
-
-
diff --git a/client/components/Username.vue b/client/components/Username.vue
deleted file mode 100644
index 3c5d644d..00000000
--- a/client/components/Username.vue
+++ /dev/null
@@ -1,84 +0,0 @@
-
- {{ mode }}{{ user.nick }}
-
-
-
diff --git a/client/components/VersionChecker.vue b/client/components/VersionChecker.vue
deleted file mode 100644
index 3070924d..00000000
--- a/client/components/VersionChecker.vue
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
Checking for updates…
-
- The Lounge {{ store.state.versionData?.latest.version }}
- (pre-release)
- is now available.
-
-
-
- Read more on GitHub
-
-
-
- The Lounge is up to date, but there are out of date packages Run
- thelounge upgrade on the server to upgrade packages.
-
-
- The Lounge is up to date!
-
-
- Check now
-
-
-
- Information about latest release could not be retrieved.
-
- Try again
-
-
-
-
-
diff --git a/client/components/Windows/Changelog.vue b/client/components/Windows/Changelog.vue
deleted file mode 100644
index 4515e6b5..00000000
--- a/client/components/Windows/Changelog.vue
+++ /dev/null
@@ -1,93 +0,0 @@
-
-
-
-
-
« Help
-
-
-
- Release notes for {{ store.state.versionData.current.version }}
-
-
-
- Introduction
-
-
-
- Unable to retrieve changelog for current release from GitHub.
-
- View release notes for this version on GitHub
-
-
-
-
Loading changelog…
-
-
-
-
-
diff --git a/client/components/Windows/Connect.vue b/client/components/Windows/Connect.vue
deleted file mode 100644
index 66d2f6e4..00000000
--- a/client/components/Windows/Connect.vue
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
-
-
-
diff --git a/client/components/Windows/Help.vue b/client/components/Windows/Help.vue
deleted file mode 100644
index d0715a2e..00000000
--- a/client/components/Windows/Help.vue
+++ /dev/null
@@ -1,879 +0,0 @@
-
-
-
-
-
Help
-
-
- About The Lounge
-
- v{{ store.state.serverConfiguration?.version }} (release notes )
-
-
-
-
-
-
Gestures
-
-
-
Single-Finger Swipe Left
-
-
-
-
-
Single-Finger Swipe Right
-
-
-
-
-
Two-Finger Swipe Left
-
-
Switch to the next window in the channel list.
-
-
-
-
-
Two-Finger Swipe Right
-
-
Switch to the previous window in the channel list.
-
-
-
-
Keyboard Shortcuts
-
-
-
- Alt Shift ↓
- ⌥ ⇧ ↓
-
-
-
Switch to the next lobby in the channel list.
-
-
-
-
-
- Alt Shift ↑
- ⌥ ⇧ ↑
-
-
-
Switch to the previous lobby in the channel list.
-
-
-
-
-
- Alt Shift ←
- ⌥ ⇧ ←
-
-
-
Collapse current network.
-
-
-
-
-
- Alt Shift →
- ⌥ ⇧ →
-
-
-
Expand current network.
-
-
-
-
-
- Alt ↓
- ⌥ ↓
-
-
-
Switch to the next window in the channel list.
-
-
-
-
-
- Alt ↑
- ⌥ ↑
-
-
-
Switch to the previous window in the channel list.
-
-
-
-
-
- Alt Ctrl ↓
- ⌥ ⌘ ↓
-
-
-
Switch to the next window with unread messages in the channel list.
-
-
-
-
-
- Alt Ctrl ↑
- ⌥ ⌘ ↑
-
-
-
Switch to the previous window with unread messages in the channel list.
-
-
-
-
-
- Alt A
- ⌥ A
-
-
-
Switch to the first window with unread messages.
-
-
-
-
-
-
-
- Alt U
- ⌥ U
-
-
-
Toggle channel user list.
-
-
-
-
-
- Alt J
- ⌥ J
-
-
-
Toggle jump to channel switcher.
-
-
-
-
-
- Alt M
- ⌥ M
-
-
-
Toggle recent mentions popup.
-
-
-
-
-
- Alt /
- ⌥ /
-
-
-
Switch to the help menu.
-
-
-
-
-
- Esc
-
-
-
- Close current contextual window (context menu, image viewer, topic edit,
- etc) and remove focus from input.
-
-
-
-
-
Formatting Shortcuts
-
-
-
- Ctrl K
- ⌘ K
-
-
-
- Mark any text typed after this shortcut to be colored. After hitting this
- shortcut, enter an integer in the range
- 0—15 to select the desired color, or use the autocompletion
- menu to choose a color name (see below).
-
-
- Background color can be specified by putting a comma and another integer in
- the range 0—15 after the foreground color number
- (autocompletion works too).
-
-
- A color reference can be found
- here .
-
-
-
-
-
-
- Ctrl B
- ⌘ B
-
-
-
- Mark all text typed after this shortcut as
- bold .
-
-
-
-
-
-
- Ctrl U
- ⌘ U
-
-
-
- Mark all text typed after this shortcut as
- underlined .
-
-
-
-
-
-
- Ctrl I
- ⌘ I
-
-
-
- Mark all text typed after this shortcut as
- italics .
-
-
-
-
-
-
- Ctrl S
- ⌘ S
-
-
-
- Mark all text typed after this shortcut as
- struck through .
-
-
-
-
-
-
- Ctrl M
- ⌘ M
-
-
-
- Mark all text typed after this shortcut as
- monospaced .
-
-
-
-
-
-
- Ctrl O
- ⌘ O
-
-
-
- Mark all text typed after this shortcut to be reset to its original
- formatting.
-
-
-
-
-
Autocompletion
-
-
- To auto-complete nicknames, channels, commands, and emoji, type one of the
- characters below to open a suggestion list. Use the ↑ and
- ↓ keys to highlight an item, and insert it by pressing Tab or
- Enter (or by clicking the desired item).
-
-
Autocompletion can be disabled in settings.
-
-
-
-
-
-
-
- /
-
-
-
Commands (see list of commands below)
-
-
-
-
-
- :
-
-
-
- Emoji (note: requires two search characters, to avoid conflicting with
- common emoticons like :))
-
-
-
-
-
Commands
-
-
-
- /away [message]
-
-
-
Mark yourself as away with an optional message.
-
-
-
-
-
- /back
-
-
-
Remove your away status (set with /away).
-
-
-
-
-
- /ban nick
-
-
-
- Ban (+b) a user from the current channel. This can be a
- nickname or a hostmask.
-
-
-
-
-
-
- /banlist
-
-
-
Load the banlist for the current channel.
-
-
-
-
-
- /collapse
-
-
-
- Collapse all previews in the current channel (opposite of
- /expand)
-
-
-
-
-
-
- /connect host [port]
-
-
-
- Connect to a new IRC network. If port starts with a
- + sign, the connection will be made secure using TLS.
-
-
Alias: /server
-
-
-
-
-
- /ctcp target cmd [args]
-
-
-
-
-
-
- /deop nick [...nick]
-
-
-
- Remove op (-o) from one or several users in the current
- channel.
-
-
-
-
-
-
- /devoice nick [...nick]
-
-
-
- Remove voice (-v) from one or several users in the current
- channel.
-
-
-
-
-
-
- /disconnect [message]
-
-
-
Disconnect from the current network with an optionally-provided message.
-
-
-
-
-
- /expand
-
-
-
- Expand all previews in the current channel (opposite of
- /collapse)
-
-
-
-
-
-
- /invite nick [channel]
-
-
-
- Invite a user to the specified channel. If
- channel is omitted, user will be invited to the current
- channel.
-
-
-
-
-
-
- /ignore nick
-
-
-
- Block any messages from the specified user on the current network. This can
- be a nickname or a hostmask.
-
-
-
-
-
-
- /ignorelist
-
-
-
Load the list of ignored users for the current network.
-
-
-
-
-
- /join channel [password]
-
-
-
- Join a channel. Password is only needed in protected channels and can
- usually be omitted.
-
-
-
-
-
-
- /kick nick [reason]
-
-
-
Kick a user from the current channel.
-
-
-
-
-
- /kickban nick [reason]
-
-
-
- Kick and ban (+b) a user from the current channel. Unlike
- /ban, only nicknames (and not host masks) can be used.
-
-
-
-
-
-
- /list
-
-
-
Retrieve a list of available channels on this network.
-
-
-
-
-
- /me message
-
-
-
- Send an action message to the current channel. The Lounge will display it
- inline, as if the message was posted in the third person.
-
-
-
-
-
-
- /mode flags [args]
-
-
-
- Set the given flags to the current channel if the active window is a
- channel, another user if the active window is a private message window, or
- yourself if the current window is a server window.
-
-
-
-
-
-
- /msg channel message
-
-
-
Send a message to the specified channel.
-
-
-
-
-
- /mute [...channel]
-
-
-
- Prevent messages from generating any feedback for a channel. This turns off
- the highlight indicator, hides mentions and inhibits push notifications.
- Muting a network lobby mutes the entire network. Not specifying any channel
- target mutes the current channel. Revert with /unmute.
-
-
-
-
-
-
- /nick newnick
-
-
-
Change your nickname on the current network.
-
-
-
-
-
- /notice channel message
-
-
-
Sends a notice message to the specified channel.
-
-
-
-
-
- /op nick [...nick]
-
-
-
Give op (+o) to one or several users in the current channel.
-
-
-
-
-
- /part [channel]
-
-
-
- Close the specified channel or private message window, or the current
- channel if channel is omitted.
-
-
Aliases: /close, /leave
-
-
-
-
-
- /rejoin
-
-
-
- Leave and immediately rejoin the current channel. Useful to quickly get op
- from ChanServ in an empty channel, for example.
-
-
Alias: /cycle
-
-
-
-
-
- /query nick
-
-
-
Send a private message to the specified user.
-
-
-
-
-
- /quit [message]
-
-
-
Disconnect from the current network with an optional message.
-
-
-
-
-
- /raw message
-
-
-
Send a raw message to the current IRC network.
-
Aliases: /quote, /send
-
-
-
-
-
- /slap nick
-
-
-
Slap someone in the current channel with a trout!
-
-
-
-
-
- /search query
-
-
-
Search for messages in the current channel / user
-
-
-
-
-
- /topic [newtopic]
-
-
-
- Get the topic in the current channel. If newtopic is specified,
- sets the topic in the current channel.
-
-
-
-
-
-
- /unban nick
-
-
-
- Unban (-b) a user from the current channel. This can be a
- nickname or a hostmask.
-
-
-
-
-
-
- /unignore nick
-
-
-
- Unblock messages from the specified user on the current network. This can be
- a nickname or a hostmask.
-
-
-
-
-
-
- /unmute [...channel]
-
-
-
- Un-mutes the given channel(s) or the current channel if no channel is
- provided. See /mute for more information.
-
-
-
-
-
-
- /voice nick [...nick]
-
-
-
- Give voice (+v) to one or several users in the current channel.
-
-
-
-
-
-
- /whois nick
-
-
-
Retrieve information about the given user on the current network.
-
-
-
-
-
-
-
diff --git a/client/components/Windows/NetworkEdit.vue b/client/components/Windows/NetworkEdit.vue
deleted file mode 100644
index 822164ce..00000000
--- a/client/components/Windows/NetworkEdit.vue
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
diff --git a/client/components/Windows/SearchResults.vue b/client/components/Windows/SearchResults.vue
deleted file mode 100644
index b182f9a0..00000000
--- a/client/components/Windows/SearchResults.vue
+++ /dev/null
@@ -1,321 +0,0 @@
-
-
-
-
-
-
-
-
-
- Loading…
- Show older messages
-
-
-
-
- Searching…
-
-
- No results found.
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/client/components/Windows/Settings.vue b/client/components/Windows/Settings.vue
deleted file mode 100644
index 0fa95372..00000000
--- a/client/components/Windows/Settings.vue
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
diff --git a/client/components/Windows/SignIn.vue b/client/components/Windows/SignIn.vue
deleted file mode 100644
index 6c095c6f..00000000
--- a/client/components/Windows/SignIn.vue
+++ /dev/null
@@ -1,116 +0,0 @@
-
-
-
-
-
diff --git a/client/css/bootstrap.css b/client/css/bootstrap.css
new file mode 100644
index 00000000..e1d5b223
--- /dev/null
+++ b/client/css/bootstrap.css
@@ -0,0 +1,1185 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=242b77ebf84da0cd12cf)
+ * Config saved to config.json and https://gist.github.com/242b77ebf84da0cd12cf
+ */
+/*! normalize.css v3.0.1 | MIT License | git.io/normalize */
+html {
+ font-family: sans-serif;
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+}
+body {
+ margin: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+ display: block;
+}
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+ vertical-align: baseline;
+}
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+[hidden],
+template {
+ display: none;
+}
+a {
+ background: transparent;
+}
+a:active,
+a:hover {
+ outline: 0;
+}
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+b,
+strong {
+ font-weight: bold;
+}
+dfn {
+ font-style: italic;
+}
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+mark {
+ background: #ff0;
+ color: #000;
+}
+small {
+ font-size: 80%;
+}
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+sup {
+ top: -0.5em;
+}
+sub {
+ bottom: -0.25em;
+}
+img {
+ border: 0;
+}
+svg:not(:root) {
+ overflow: hidden;
+}
+figure {
+ margin: 1em 40px;
+}
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+pre {
+ overflow: auto;
+}
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, monospace;
+ font-size: 1em;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit;
+ font: inherit;
+ margin: 0;
+}
+button {
+ overflow: visible;
+}
+button,
+select {
+ text-transform: none;
+}
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button;
+ cursor: pointer;
+}
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+input {
+ line-height: normal;
+}
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+input[type="search"] {
+ -webkit-appearance: textfield;
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+}
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+legend {
+ border: 0;
+ padding: 0;
+}
+textarea {
+ overflow: auto;
+}
+optgroup {
+ font-weight: bold;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+td,
+th {
+ padding: 0;
+}
+* {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+*:before,
+*:after {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+html {
+ font-size: 10px;
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ line-height: 1.42857143;
+ color: #333333;
+ background-color: #ffffff;
+}
+input,
+button,
+select,
+textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+a {
+ color: #428bca;
+ text-decoration: none;
+}
+a:hover,
+a:focus {
+ color: #2a6496;
+ text-decoration: underline;
+}
+a:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+figure {
+ margin: 0;
+}
+img {
+ vertical-align: middle;
+}
+.img-responsive {
+ display: block;
+ width: 100% \9;
+ max-width: 100%;
+ height: auto;
+}
+.img-rounded {
+ border-radius: 6px;
+}
+.img-thumbnail {
+ padding: 4px;
+ line-height: 1.42857143;
+ background-color: #ffffff;
+ border: 1px solid #dddddd;
+ border-radius: 4px;
+ -webkit-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+ display: inline-block;
+ width: 100% \9;
+ max-width: 100%;
+ height: auto;
+}
+.img-circle {
+ border-radius: 50%;
+}
+hr {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ border: 0;
+ border-top: 1px solid #eeeeee;
+}
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ margin: -1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ margin: 0;
+ overflow: visible;
+ clip: auto;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small,
+.h1 small,
+.h2 small,
+.h3 small,
+.h4 small,
+.h5 small,
+.h6 small,
+h1 .small,
+h2 .small,
+h3 .small,
+h4 .small,
+h5 .small,
+h6 .small,
+.h1 .small,
+.h2 .small,
+.h3 .small,
+.h4 .small,
+.h5 .small,
+.h6 .small {
+ font-weight: normal;
+ line-height: 1;
+ color: #777777;
+}
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
+ margin-top: 20px;
+ margin-bottom: 10px;
+}
+h1 small,
+.h1 small,
+h2 small,
+.h2 small,
+h3 small,
+.h3 small,
+h1 .small,
+.h1 .small,
+h2 .small,
+.h2 .small,
+h3 .small,
+.h3 .small {
+ font-size: 65%;
+}
+h4,
+.h4,
+h5,
+.h5,
+h6,
+.h6 {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+h4 small,
+.h4 small,
+h5 small,
+.h5 small,
+h6 small,
+.h6 small,
+h4 .small,
+.h4 .small,
+h5 .small,
+.h5 .small,
+h6 .small,
+.h6 .small {
+ font-size: 75%;
+}
+h1,
+.h1 {
+ font-size: 36px;
+}
+h2,
+.h2 {
+ font-size: 30px;
+}
+h3,
+.h3 {
+ font-size: 24px;
+}
+h4,
+.h4 {
+ font-size: 18px;
+}
+h5,
+.h5 {
+ font-size: 14px;
+}
+h6,
+.h6 {
+ font-size: 12px;
+}
+p {
+ margin: 0 0 10px;
+}
+.lead {
+ margin-bottom: 20px;
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 1.4;
+}
+@media (min-width: 768px) {
+ .lead {
+ font-size: 21px;
+ }
+}
+small,
+.small {
+ font-size: 85%;
+}
+cite {
+ font-style: normal;
+}
+mark,
+.mark {
+ background-color: #fcf8e3;
+ padding: .2em;
+}
+.text-left {
+ text-align: left;
+}
+.text-right {
+ text-align: right;
+}
+.text-center {
+ text-align: center;
+}
+.text-justify {
+ text-align: justify;
+}
+.text-nowrap {
+ white-space: nowrap;
+}
+.text-lowercase {
+ text-transform: lowercase;
+}
+.text-uppercase {
+ text-transform: uppercase;
+}
+.text-capitalize {
+ text-transform: capitalize;
+}
+.text-muted {
+ color: #777777;
+}
+.text-primary {
+ color: #428bca;
+}
+a.text-primary:hover {
+ color: #3071a9;
+}
+.text-success {
+ color: #3c763d;
+}
+a.text-success:hover {
+ color: #2b542c;
+}
+.text-info {
+ color: #31708f;
+}
+a.text-info:hover {
+ color: #245269;
+}
+.text-warning {
+ color: #8a6d3b;
+}
+a.text-warning:hover {
+ color: #66512c;
+}
+.text-danger {
+ color: #a94442;
+}
+a.text-danger:hover {
+ color: #843534;
+}
+.bg-primary {
+ color: #fff;
+ background-color: #428bca;
+}
+a.bg-primary:hover {
+ background-color: #3071a9;
+}
+.bg-success {
+ background-color: #dff0d8;
+}
+a.bg-success:hover {
+ background-color: #c1e2b3;
+}
+.bg-info {
+ background-color: #d9edf7;
+}
+a.bg-info:hover {
+ background-color: #afd9ee;
+}
+.bg-warning {
+ background-color: #fcf8e3;
+}
+a.bg-warning:hover {
+ background-color: #f7ecb5;
+}
+.bg-danger {
+ background-color: #f2dede;
+}
+a.bg-danger:hover {
+ background-color: #e4b9b9;
+}
+.page-header {
+ padding-bottom: 9px;
+ margin: 40px 0 20px;
+ border-bottom: 1px solid #eeeeee;
+}
+ul,
+ol {
+ margin-top: 0;
+ margin-bottom: 10px;
+}
+ul ul,
+ol ul,
+ul ol,
+ol ol {
+ margin-bottom: 0;
+}
+.list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
+.list-inline {
+ padding-left: 0;
+ list-style: none;
+ margin-left: -5px;
+}
+.list-inline > li {
+ display: inline-block;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+dl {
+ margin-top: 0;
+ margin-bottom: 20px;
+}
+dt,
+dd {
+ line-height: 1.42857143;
+}
+dt {
+ font-weight: bold;
+}
+dd {
+ margin-left: 0;
+}
+@media (min-width: 768px) {
+ .dl-horizontal dt {
+ float: left;
+ width: 160px;
+ clear: left;
+ text-align: right;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ .dl-horizontal dd {
+ margin-left: 180px;
+ }
+}
+abbr[title],
+abbr[data-original-title] {
+ cursor: help;
+ border-bottom: 1px dotted #777777;
+}
+.initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+blockquote {
+ padding: 10px 20px;
+ margin: 0 0 20px;
+ font-size: 17.5px;
+ border-left: 5px solid #eeeeee;
+}
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+ margin-bottom: 0;
+}
+blockquote footer,
+blockquote small,
+blockquote .small {
+ display: block;
+ font-size: 80%;
+ line-height: 1.42857143;
+ color: #777777;
+}
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+ content: '\2014 \00A0';
+}
+.blockquote-reverse,
+blockquote.pull-right {
+ padding-right: 15px;
+ padding-left: 0;
+ border-right: 5px solid #eeeeee;
+ border-left: 0;
+ text-align: right;
+}
+.blockquote-reverse footer:before,
+blockquote.pull-right footer:before,
+.blockquote-reverse small:before,
+blockquote.pull-right small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right .small:before {
+ content: '';
+}
+.blockquote-reverse footer:after,
+blockquote.pull-right footer:after,
+.blockquote-reverse small:after,
+blockquote.pull-right small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right .small:after {
+ content: '\00A0 \2014';
+}
+blockquote:before,
+blockquote:after {
+ content: "";
+}
+address {
+ margin-bottom: 20px;
+ font-style: normal;
+ line-height: 1.42857143;
+}
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 15px;
+ padding-right: 15px;
+}
+@media (min-width: 768px) {
+ .container {
+ width: 750px;
+ }
+}
+@media (min-width: 992px) {
+ .container {
+ width: 970px;
+ }
+}
+@media (min-width: 1200px) {
+ .container {
+ width: 1170px;
+ }
+}
+.container-fluid {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 15px;
+ padding-right: 15px;
+}
+.row {
+ margin-left: -15px;
+ margin-right: -15px;
+}
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+ position: relative;
+ min-height: 1px;
+ padding-left: 15px;
+ padding-right: 15px;
+}
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+ float: left;
+}
+.col-xs-12 {
+ width: 100%;
+}
+.col-xs-11 {
+ width: 91.66666667%;
+}
+.col-xs-10 {
+ width: 83.33333333%;
+}
+.col-xs-9 {
+ width: 75%;
+}
+.col-xs-8 {
+ width: 66.66666667%;
+}
+.col-xs-7 {
+ width: 58.33333333%;
+}
+.col-xs-6 {
+ width: 50%;
+}
+.col-xs-5 {
+ width: 41.66666667%;
+}
+.col-xs-4 {
+ width: 33.33333333%;
+}
+.col-xs-3 {
+ width: 25%;
+}
+.col-xs-2 {
+ width: 16.66666667%;
+}
+.col-xs-1 {
+ width: 8.33333333%;
+}
+.col-xs-pull-12 {
+ right: 100%;
+}
+.col-xs-pull-11 {
+ right: 91.66666667%;
+}
+.col-xs-pull-10 {
+ right: 83.33333333%;
+}
+.col-xs-pull-9 {
+ right: 75%;
+}
+.col-xs-pull-8 {
+ right: 66.66666667%;
+}
+.col-xs-pull-7 {
+ right: 58.33333333%;
+}
+.col-xs-pull-6 {
+ right: 50%;
+}
+.col-xs-pull-5 {
+ right: 41.66666667%;
+}
+.col-xs-pull-4 {
+ right: 33.33333333%;
+}
+.col-xs-pull-3 {
+ right: 25%;
+}
+.col-xs-pull-2 {
+ right: 16.66666667%;
+}
+.col-xs-pull-1 {
+ right: 8.33333333%;
+}
+.col-xs-pull-0 {
+ right: auto;
+}
+.col-xs-push-12 {
+ left: 100%;
+}
+.col-xs-push-11 {
+ left: 91.66666667%;
+}
+.col-xs-push-10 {
+ left: 83.33333333%;
+}
+.col-xs-push-9 {
+ left: 75%;
+}
+.col-xs-push-8 {
+ left: 66.66666667%;
+}
+.col-xs-push-7 {
+ left: 58.33333333%;
+}
+.col-xs-push-6 {
+ left: 50%;
+}
+.col-xs-push-5 {
+ left: 41.66666667%;
+}
+.col-xs-push-4 {
+ left: 33.33333333%;
+}
+.col-xs-push-3 {
+ left: 25%;
+}
+.col-xs-push-2 {
+ left: 16.66666667%;
+}
+.col-xs-push-1 {
+ left: 8.33333333%;
+}
+.col-xs-push-0 {
+ left: auto;
+}
+.col-xs-offset-12 {
+ margin-left: 100%;
+}
+.col-xs-offset-11 {
+ margin-left: 91.66666667%;
+}
+.col-xs-offset-10 {
+ margin-left: 83.33333333%;
+}
+.col-xs-offset-9 {
+ margin-left: 75%;
+}
+.col-xs-offset-8 {
+ margin-left: 66.66666667%;
+}
+.col-xs-offset-7 {
+ margin-left: 58.33333333%;
+}
+.col-xs-offset-6 {
+ margin-left: 50%;
+}
+.col-xs-offset-5 {
+ margin-left: 41.66666667%;
+}
+.col-xs-offset-4 {
+ margin-left: 33.33333333%;
+}
+.col-xs-offset-3 {
+ margin-left: 25%;
+}
+.col-xs-offset-2 {
+ margin-left: 16.66666667%;
+}
+.col-xs-offset-1 {
+ margin-left: 8.33333333%;
+}
+.col-xs-offset-0 {
+ margin-left: 0%;
+}
+@media (min-width: 480px) {
+ .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+ float: left;
+ }
+ .col-sm-12 {
+ width: 100%;
+ }
+ .col-sm-11 {
+ width: 91.66666667%;
+ }
+ .col-sm-10 {
+ width: 83.33333333%;
+ }
+ .col-sm-9 {
+ width: 75%;
+ }
+ .col-sm-8 {
+ width: 66.66666667%;
+ }
+ .col-sm-7 {
+ width: 58.33333333%;
+ }
+ .col-sm-6 {
+ width: 50%;
+ }
+ .col-sm-5 {
+ width: 41.66666667%;
+ }
+ .col-sm-4 {
+ width: 33.33333333%;
+ }
+ .col-sm-3 {
+ width: 25%;
+ }
+ .col-sm-2 {
+ width: 16.66666667%;
+ }
+ .col-sm-1 {
+ width: 8.33333333%;
+ }
+ .col-sm-pull-12 {
+ right: 100%;
+ }
+ .col-sm-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-sm-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-sm-pull-9 {
+ right: 75%;
+ }
+ .col-sm-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-sm-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-sm-pull-6 {
+ right: 50%;
+ }
+ .col-sm-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-sm-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-sm-pull-3 {
+ right: 25%;
+ }
+ .col-sm-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-sm-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-sm-pull-0 {
+ right: auto;
+ }
+ .col-sm-push-12 {
+ left: 100%;
+ }
+ .col-sm-push-11 {
+ left: 91.66666667%;
+ }
+ .col-sm-push-10 {
+ left: 83.33333333%;
+ }
+ .col-sm-push-9 {
+ left: 75%;
+ }
+ .col-sm-push-8 {
+ left: 66.66666667%;
+ }
+ .col-sm-push-7 {
+ left: 58.33333333%;
+ }
+ .col-sm-push-6 {
+ left: 50%;
+ }
+ .col-sm-push-5 {
+ left: 41.66666667%;
+ }
+ .col-sm-push-4 {
+ left: 33.33333333%;
+ }
+ .col-sm-push-3 {
+ left: 25%;
+ }
+ .col-sm-push-2 {
+ left: 16.66666667%;
+ }
+ .col-sm-push-1 {
+ left: 8.33333333%;
+ }
+ .col-sm-push-0 {
+ left: auto;
+ }
+ .col-sm-offset-12 {
+ margin-left: 100%;
+ }
+ .col-sm-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-sm-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-sm-offset-9 {
+ margin-left: 75%;
+ }
+ .col-sm-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-sm-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-sm-offset-6 {
+ margin-left: 50%;
+ }
+ .col-sm-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-sm-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-sm-offset-3 {
+ margin-left: 25%;
+ }
+ .col-sm-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-sm-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-sm-offset-0 {
+ margin-left: 0%;
+ }
+}
+.fade {
+ opacity: 0;
+ -webkit-transition: opacity 0.15s linear;
+ -o-transition: opacity 0.15s linear;
+ transition: opacity 0.15s linear;
+}
+.fade.in {
+ opacity: 1;
+}
+.collapse {
+ display: none;
+}
+.collapse.in {
+ display: block;
+}
+tr.collapse.in {
+ display: table-row;
+}
+tbody.collapse.in {
+ display: table-row-group;
+}
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ -webkit-transition: height 0.35s ease;
+ -o-transition: height 0.35s ease;
+ transition: height 0.35s ease;
+}
+.clearfix:before,
+.clearfix:after,
+.dl-horizontal dd:before,
+.dl-horizontal dd:after,
+.container:before,
+.container:after,
+.container-fluid:before,
+.container-fluid:after,
+.row:before,
+.row:after {
+ content: " ";
+ display: table;
+}
+.clearfix:after,
+.dl-horizontal dd:after,
+.container:after,
+.container-fluid:after,
+.row:after {
+ clear: both;
+}
+.center-block {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+.pull-right {
+ float: right !important;
+}
+.pull-left {
+ float: left !important;
+}
+.hide {
+ display: none !important;
+}
+.show {
+ display: block !important;
+}
+.invisible {
+ visibility: hidden;
+}
+.text-hide {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+.hidden {
+ display: none !important;
+ visibility: hidden !important;
+}
+.affix {
+ position: fixed;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+@-ms-viewport {
+ width: device-width;
+}
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg {
+ display: none !important;
+}
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+ display: none !important;
+}
+@media (max-width: 479px) {
+ .visible-xs {
+ display: block !important;
+ }
+ table.visible-xs {
+ display: table;
+ }
+ tr.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-xs,
+ td.visible-xs {
+ display: table-cell !important;
+ }
+}
+@media (max-width: 479px) {
+ .visible-xs-block {
+ display: block !important;
+ }
+}
+@media (max-width: 479px) {
+ .visible-xs-inline {
+ display: inline !important;
+ }
+}
+@media (max-width: 479px) {
+ .visible-xs-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (max-width: 479px) {
+ .hidden-xs {
+ display: none !important;
+ }
+}
+.visible-print {
+ display: none !important;
+}
+@media print {
+ .visible-print {
+ display: block !important;
+ }
+ table.visible-print {
+ display: table;
+ }
+ tr.visible-print {
+ display: table-row !important;
+ }
+ th.visible-print,
+ td.visible-print {
+ display: table-cell !important;
+ }
+}
+.visible-print-block {
+ display: none !important;
+}
+@media print {
+ .visible-print-block {
+ display: block !important;
+ }
+}
+.visible-print-inline {
+ display: none !important;
+}
+@media print {
+ .visible-print-inline {
+ display: inline !important;
+ }
+}
+.visible-print-inline-block {
+ display: none !important;
+}
+@media print {
+ .visible-print-inline-block {
+ display: inline-block !important;
+ }
+}
+@media print {
+ .hidden-print {
+ display: none !important;
+ }
+}
diff --git a/client/css/fontawesome.css b/client/css/fontawesome.css
deleted file mode 100644
index a8016f53..00000000
--- a/client/css/fontawesome.css
+++ /dev/null
@@ -1,9 +0,0 @@
-@font-face {
- /* We use free solid icons - https://fontawesome.com/icons?s=solid&m=free */
- font-family: FontAwesome;
- font-weight: normal;
- font-style: normal;
- src:
- url("../fonts/fa-solid-900.woff2") format("woff2"),
- url("../fonts/fa-solid-900.woff") format("woff");
-}
diff --git a/client/css/fonts/Lato-700/LICENSE.txt b/client/css/fonts/Lato-700/LICENSE.txt
new file mode 100755
index 00000000..98383e3d
--- /dev/null
+++ b/client/css/fonts/Lato-700/LICENSE.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2010-2014 by tyPoland Lukasz Dziedzic (team@latofonts.com) with Reserved Font Name "Lato"
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/client/css/fonts/Lato-700/Lato-700.eot b/client/css/fonts/Lato-700/Lato-700.eot
new file mode 100755
index 00000000..30b5dffe
Binary files /dev/null and b/client/css/fonts/Lato-700/Lato-700.eot differ
diff --git a/client/css/fonts/Lato-700/Lato-700.svg b/client/css/fonts/Lato-700/Lato-700.svg
new file mode 100755
index 00000000..bac8d6da
--- /dev/null
+++ b/client/css/fonts/Lato-700/Lato-700.svg
@@ -0,0 +1,4457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/css/fonts/Lato-700/Lato-700.ttf b/client/css/fonts/Lato-700/Lato-700.ttf
new file mode 100755
index 00000000..e8b9bf6a
Binary files /dev/null and b/client/css/fonts/Lato-700/Lato-700.ttf differ
diff --git a/client/css/fonts/Lato-700/Lato-700.woff b/client/css/fonts/Lato-700/Lato-700.woff
new file mode 100755
index 00000000..66c8242c
Binary files /dev/null and b/client/css/fonts/Lato-700/Lato-700.woff differ
diff --git a/client/css/fonts/Lato-700/Lato-700.woff2 b/client/css/fonts/Lato-700/Lato-700.woff2
new file mode 100755
index 00000000..a9ffeae9
Binary files /dev/null and b/client/css/fonts/Lato-700/Lato-700.woff2 differ
diff --git a/client/css/fonts/Lato-regular/LICENSE.txt b/client/css/fonts/Lato-regular/LICENSE.txt
new file mode 100755
index 00000000..98383e3d
--- /dev/null
+++ b/client/css/fonts/Lato-regular/LICENSE.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2010-2014 by tyPoland Lukasz Dziedzic (team@latofonts.com) with Reserved Font Name "Lato"
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/client/css/fonts/Lato-regular/Lato-regular.eot b/client/css/fonts/Lato-regular/Lato-regular.eot
new file mode 100755
index 00000000..28343da0
Binary files /dev/null and b/client/css/fonts/Lato-regular/Lato-regular.eot differ
diff --git a/client/css/fonts/Lato-regular/Lato-regular.svg b/client/css/fonts/Lato-regular/Lato-regular.svg
new file mode 100755
index 00000000..f7678d37
--- /dev/null
+++ b/client/css/fonts/Lato-regular/Lato-regular.svg
@@ -0,0 +1,4148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/css/fonts/Lato-regular/Lato-regular.ttf b/client/css/fonts/Lato-regular/Lato-regular.ttf
new file mode 100755
index 00000000..7608bc3e
Binary files /dev/null and b/client/css/fonts/Lato-regular/Lato-regular.ttf differ
diff --git a/client/css/fonts/Lato-regular/Lato-regular.woff b/client/css/fonts/Lato-regular/Lato-regular.woff
new file mode 100755
index 00000000..fe27504d
Binary files /dev/null and b/client/css/fonts/Lato-regular/Lato-regular.woff differ
diff --git a/client/css/fonts/Lato-regular/Lato-regular.woff2 b/client/css/fonts/Lato-regular/Lato-regular.woff2
new file mode 100755
index 00000000..c83fe955
Binary files /dev/null and b/client/css/fonts/Lato-regular/Lato-regular.woff2 differ
diff --git a/client/css/fonts/Open-Sans-300/LICENSE.txt b/client/css/fonts/Open-Sans-300/LICENSE.txt
new file mode 100755
index 00000000..d6456956
--- /dev/null
+++ b/client/css/fonts/Open-Sans-300/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/client/css/fonts/Open-Sans-300/Open-Sans-300.eot b/client/css/fonts/Open-Sans-300/Open-Sans-300.eot
new file mode 100755
index 00000000..5219d9e2
Binary files /dev/null and b/client/css/fonts/Open-Sans-300/Open-Sans-300.eot differ
diff --git a/client/css/fonts/Open-Sans-300/Open-Sans-300.svg b/client/css/fonts/Open-Sans-300/Open-Sans-300.svg
new file mode 100755
index 00000000..851d83c7
--- /dev/null
+++ b/client/css/fonts/Open-Sans-300/Open-Sans-300.svg
@@ -0,0 +1,1633 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/css/fonts/Open-Sans-300/Open-Sans-300.ttf b/client/css/fonts/Open-Sans-300/Open-Sans-300.ttf
new file mode 100755
index 00000000..d7d7cd1f
Binary files /dev/null and b/client/css/fonts/Open-Sans-300/Open-Sans-300.ttf differ
diff --git a/client/css/fonts/Open-Sans-300/Open-Sans-300.woff b/client/css/fonts/Open-Sans-300/Open-Sans-300.woff
new file mode 100755
index 00000000..32da261f
Binary files /dev/null and b/client/css/fonts/Open-Sans-300/Open-Sans-300.woff differ
diff --git a/client/css/fonts/Open-Sans-300/Open-Sans-300.woff2 b/client/css/fonts/Open-Sans-300/Open-Sans-300.woff2
new file mode 100755
index 00000000..cf3ec55e
Binary files /dev/null and b/client/css/fonts/Open-Sans-300/Open-Sans-300.woff2 differ
diff --git a/client/css/fonts/Open-Sans-700/LICENSE.txt b/client/css/fonts/Open-Sans-700/LICENSE.txt
new file mode 100755
index 00000000..d6456956
--- /dev/null
+++ b/client/css/fonts/Open-Sans-700/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/client/css/fonts/Open-Sans-700/Open-Sans-700.eot b/client/css/fonts/Open-Sans-700/Open-Sans-700.eot
new file mode 100755
index 00000000..a78a2a9b
Binary files /dev/null and b/client/css/fonts/Open-Sans-700/Open-Sans-700.eot differ
diff --git a/client/css/fonts/Open-Sans-700/Open-Sans-700.svg b/client/css/fonts/Open-Sans-700/Open-Sans-700.svg
new file mode 100755
index 00000000..a294c817
--- /dev/null
+++ b/client/css/fonts/Open-Sans-700/Open-Sans-700.svg
@@ -0,0 +1,1635 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/css/fonts/Open-Sans-700/Open-Sans-700.ttf b/client/css/fonts/Open-Sans-700/Open-Sans-700.ttf
new file mode 100755
index 00000000..974a7c5e
Binary files /dev/null and b/client/css/fonts/Open-Sans-700/Open-Sans-700.ttf differ
diff --git a/client/css/fonts/Open-Sans-700/Open-Sans-700.woff b/client/css/fonts/Open-Sans-700/Open-Sans-700.woff
new file mode 100755
index 00000000..ca2f1c27
Binary files /dev/null and b/client/css/fonts/Open-Sans-700/Open-Sans-700.woff differ
diff --git a/client/css/fonts/Open-Sans-700/Open-Sans-700.woff2 b/client/css/fonts/Open-Sans-700/Open-Sans-700.woff2
new file mode 100755
index 00000000..51c75cad
Binary files /dev/null and b/client/css/fonts/Open-Sans-700/Open-Sans-700.woff2 differ
diff --git a/client/css/fonts/Open-Sans-regular/LICENSE.txt b/client/css/fonts/Open-Sans-regular/LICENSE.txt
new file mode 100755
index 00000000..d6456956
--- /dev/null
+++ b/client/css/fonts/Open-Sans-regular/LICENSE.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/client/css/fonts/Open-Sans-regular/Open-Sans-regular.eot b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.eot
new file mode 100755
index 00000000..1d98e6ea
Binary files /dev/null and b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.eot differ
diff --git a/client/css/fonts/Open-Sans-regular/Open-Sans-regular.svg b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.svg
new file mode 100755
index 00000000..052c59ff
--- /dev/null
+++ b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.svg
@@ -0,0 +1,1637 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/css/fonts/Open-Sans-regular/Open-Sans-regular.ttf b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.ttf
new file mode 100755
index 00000000..0dae9c3b
Binary files /dev/null and b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.ttf differ
diff --git a/client/css/fonts/Open-Sans-regular/Open-Sans-regular.woff b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.woff
new file mode 100755
index 00000000..ac2b2c65
Binary files /dev/null and b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.woff differ
diff --git a/client/css/fonts/Open-Sans-regular/Open-Sans-regular.woff2 b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.woff2
new file mode 100755
index 00000000..402dfd77
Binary files /dev/null and b/client/css/fonts/Open-Sans-regular/Open-Sans-regular.woff2 differ
diff --git a/client/css/fonts/inconsolatag.ttf b/client/css/fonts/inconsolatag.ttf
new file mode 100644
index 00000000..1a212c65
Binary files /dev/null and b/client/css/fonts/inconsolatag.ttf differ
diff --git a/client/css/fonts/inconsolatag.woff b/client/css/fonts/inconsolatag.woff
new file mode 100644
index 00000000..d5ac16fb
Binary files /dev/null and b/client/css/fonts/inconsolatag.woff differ
diff --git a/client/css/style.css b/client/css/style.css
index 86bc5f81..a9449a68 100644
--- a/client/css/style.css
+++ b/client/css/style.css
@@ -1,653 +1,334 @@
-@import "../../node_modules/normalize.css/normalize.css";
-@import "fontawesome.css";
-@import "../../node_modules/primer-tooltips/build/build.css";
-
-:root {
- /* Main text color */
- --body-color: #222;
-
- /* Secondary text color, dimmed. Make sure to keep contrast WCAG 2.0 AA compliant on var(--window-bg-color) */
- --body-color-muted: #767676;
-
- /* Background color of the whole page */
- --body-bg-color: #415364;
-
- /* Main button color. Applies to border, text, and background on hover */
- --button-color: #84ce88;
- --button-text-color-hover: #fff;
-
- /* Color for sidebar overlay and other things that dim the viewport when something else is on top */
- --overlay-bg-color: rgb(0 0 0 / 50%);
-
- /* Links and link-looking buttons */
- --link-color: #50a656;
-
- /* Background color of the main window */
- --window-bg-color: #fff;
-
- /* Text color for and headings in windows */
- --window-heading-color: #6c797a;
-
- /* Color of the date marker, text and separator */
- --date-marker-color: rgb(0 107 59 / 50%);
-
- /* Color of the unread message marker, text and separator */
- --unread-marker-color: rgb(231 76 60 / 50%);
-
- /* Background and left-border color of highlight messages */
- --highlight-bg-color: #efe8dc;
- --highlight-border-color: #b08c4f;
-
- /* Color of the progress bar that appears as a file is being uploaded to the server. Defaults to button color */
- --upload-progressbar-color: var(--button-color);
+@font-face {
+ font-family: "Lato";
+ font-weight: 400;
+ font-style: normal;
+ src: url("fonts/Lato-regular/Lato-regular.eot");
+ src:
+ url("fonts/Lato-regular/Lato-regular.eot?#iefix") format("embedded-opentype"),
+ local("Lato Regular"),
+ local("Lato-regular"),
+ url("fonts/Lato-regular/Lato-regular.woff2") format("woff2"),
+ url("fonts/Lato-regular/Lato-regular.woff") format("woff"),
+ url("fonts/Lato-regular/Lato-regular.ttf") format("truetype"),
+ url("fonts/Lato-regular/Lato-regular.svg#Lato") format("svg");
}
-::placeholder {
- color: rgb(0 0 0 / 35%);
- opacity: 1; /* fix opacity in Firefox */
+@font-face {
+ font-family: "Lato";
+ font-weight: 700;
+ font-style: normal;
+ src: url("fonts/Lato-700/Lato-700.eot");
+ src:
+ url("fonts/Lato-700/Lato-700.eot?#iefix") format("embedded-opentype"),
+ local("Lato Bold"),
+ local("Lato-700"),
+ url("fonts/Lato-700/Lato-700.woff2") format("woff2"),
+ url("fonts/Lato-700/Lato-700.woff") format("woff"),
+ url("fonts/Lato-700/Lato-700.ttf") format("truetype"),
+ url("fonts/Lato-700/Lato-700.svg#Lato") format("svg");
}
-html {
- box-sizing: border-box;
- -webkit-tap-highlight-color: transparent; /* remove tap highlight on touch devices */
+@font-face {
+ font-family: "Open Sans";
+ font-weight: 300;
+ font-style: normal;
+ src: url("fonts/Open-Sans-300/Open-Sans-300.eot");
+ src:
+ url("fonts/Open-Sans-300/Open-Sans-300.eot?#iefix") format("embedded-opentype"),
+ local("Open Sans Light"),
+ local("Open-Sans-300"),
+ url("fonts/Open-Sans-300/Open-Sans-300.woff2") format("woff2"),
+ url("fonts/Open-Sans-300/Open-Sans-300.woff") format("woff"),
+ url("fonts/Open-Sans-300/Open-Sans-300.ttf") format("truetype"),
+ url("fonts/Open-Sans-300/Open-Sans-300.svg#OpenSans") format("svg");
}
-*,
-*::before,
-*::after {
- box-sizing: inherit;
+@font-face {
+ font-family: "Open Sans";
+ font-weight: 400;
+ font-style: normal;
+ src: url("fonts/Open-Sans-regular/Open-Sans-regular.eot");
+ src:
+ url("fonts/Open-Sans-regular/Open-Sans-regular.eot?#iefix") format("embedded-opentype"),
+ local("Open Sans"),
+ local("Open-Sans-regular"),
+ url("fonts/Open-Sans-regular/Open-Sans-regular.woff2") format("woff2"),
+ url("fonts/Open-Sans-regular/Open-Sans-regular.woff") format("woff"),
+ url("fonts/Open-Sans-regular/Open-Sans-regular.ttf") format("truetype"),
+ url("fonts/Open-Sans-regular/Open-Sans-regular.svg#OpenSans") format("svg");
}
-input,
-button,
-select,
-textarea {
- font: inherit;
- color: inherit;
+@font-face {
+ font-family: "Open Sans";
+ font-weight: 700;
+ font-style: normal;
+ src: url("fonts/Open-Sans-700/Open-Sans-700.eot");
+ src:
+ url("fonts/Open-Sans-700/Open-Sans-700.eot?#iefix") format("embedded-opentype"),
+ local("Open Sans Bold"),
+ local("Open-Sans-700"),
+ url("fonts/Open-Sans-700/Open-Sans-700.woff2") format("woff2"),
+ url("fonts/Open-Sans-700/Open-Sans-700.woff") format("woff"),
+ url("fonts/Open-Sans-700/Open-Sans-700.ttf") format("truetype"),
+ url("fonts/Open-Sans-700/Open-Sans-700.svg#OpenSans") format("svg");
}
-img {
- vertical-align: middle;
-}
-
-.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- margin: -1px;
- padding: 0;
- overflow: hidden;
- clip: rect(0, 0, 0, 0);
- border: 0;
-}
-
-abbr[title] {
- cursor: help;
+@font-face {
+ font-family: "FontAwesome";
+ src: url("../fonts/fontawesome-webfont.eot?v=4.6.3");
+ src: url("../fonts/fontawesome-webfont.eot?#iefix&v=4.6.3") format("embedded-opentype"), url("../fonts/fontawesome-webfont.woff2?v=4.6.3") format("woff2"), url("../fonts/fontawesome-webfont.woff?v=4.6.3") format("woff"), url("../fonts/fontawesome-webfont.ttf?v=4.6.3") format("truetype"), url("../fonts/fontawesome-webfont.svg?v=4.6.3#fontawesomeregular") format("svg");
+ font-weight: normal;
+ font-style: normal;
}
html,
body {
height: 100%;
- overscroll-behavior: none; /* prevent overscroll navigation actions */
}
body {
- background: var(--body-bg-color);
- color: var(--body-color);
- font: 16px -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
+ background: #455164;
+ color: #222;
+ font: 16px Lato, sans-serif;
margin: 0;
- user-select: none;
- cursor: default;
- touch-action: none;
-
- /**
- * Disable pull-to-refresh on mobile that conflicts with scrolling the message list.
- * See http://stackoverflow.com/a/29313685/1935861
- */
- overflow: hidden; /* iOS Safari requires overflow rather than overflow-y */
}
-body.force-no-select * {
- user-select: none !important;
-}
-
-a,
-a:hover,
-a:focus {
- color: var(--link-color);
- text-decoration: none;
+a {
+ transition: opacity .2s;
}
a:hover {
- text-decoration: underline;
-}
-
-a:focus {
- outline: thin dotted;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
+ text-decoration: none;
+ opacity: .8;
}
h1,
-h2,
-h3 {
+h2 {
font: inherit;
line-height: inherit;
margin: 0;
}
+h1.title {
+ margin-bottom: 10px;
+}
+
+input {
+ outline: 0;
+}
+
button {
border: none;
background: none;
margin: 0;
outline: none;
padding: 0;
- user-select: inherit;
- cursor: pointer;
-}
-
-code,
-pre,
-#chat .msg[data-type="monospace_block"] .text,
-.irc-monospace,
-textarea#user-specified-css-input {
- font-family: Consolas, Menlo, Monaco, "Lucida Console", "DejaVu Sans Mono", "Courier New", monospace;
-}
-
-code,
-.irc-monospace {
- font-size: 13px;
- padding: 2px 4px;
- color: #e74c3c;
- background-color: #f9f2f4;
- border-radius: 2px;
-}
-
-pre {
- display: block;
- padding: 9.5px;
- margin: 0 0 10px;
- font-size: 13px;
- line-height: 1.4286;
- color: #333;
- word-break: break-all;
- word-wrap: break-word;
- background-color: #f5f5f5;
- border-radius: 4px;
-}
-
-kbd {
- display: inline-block;
- font-family: inherit;
- line-height: 1em;
- min-width: 28px; /* Ensure 1-char keys have the same width */
- margin: 0 1px;
- padding: 4px 6px;
- color: #444;
- text-align: center;
- text-shadow: 0 1px 0 #fff;
- background-color: white;
- background-image: linear-gradient(180deg, rgb(0 0 0 / 5%), transparent);
- border: 1px solid #bbb;
- border-radius: 4px;
- box-shadow: 0 2px 0 #bbb, inset 0 1px 1px #fff, inset 0 -1px 3px #ccc;
-}
-
-p {
- margin: 0 0 10px;
}
.btn {
- border: 2px solid var(--button-color);
+ border: 2px solid #84ce88;
border-radius: 3px;
- color: var(--button-color);
+ color: #84ce88;
display: inline-block;
- font-size: 12px;
- font-weight: bold;
+ font: bold 12px Lato, sans-serif;
letter-spacing: 1px;
margin-bottom: 10px;
padding: 9px 17px;
text-transform: uppercase;
- transition: background 0.2s, border-color 0.2s, color 0.2s, box-shadow 0.2s;
+ transition: background .2s, border-color .2s, color .2s;
word-spacing: 3px;
- cursor: pointer; /* This is useful for `` elements */
-}
-
-.btn-small {
- padding: 5px 13px;
}
.btn:disabled,
-.btn:hover,
-.btn:focus {
- background: var(--button-color);
- color: var(--button-text-color-hover);
- opacity: 1;
-}
-
-.input:focus,
-.btn:active,
-.btn:focus {
- outline: 0;
- box-shadow: 0 0 0 3px rgb(132 206 136 / 50%);
+.btn:hover {
+ background: #84ce88;
+ color: #fff;
}
.btn:active {
- opacity: 0.8;
+ box-shadow: none;
+ opacity: .8;
}
.btn:disabled {
- opacity: 0.6;
-}
-
-.btn-sm {
- padding: 4px 8px;
- border-width: 1px;
- letter-spacing: 0;
- word-spacing: 0;
- text-transform: none;
+ opacity: .6;
}
.container {
- padding: 0 15px;
- margin-bottom: 20px;
- width: 480px;
- align-self: center;
- touch-action: pan-y;
+ margin: 80px auto;
+ max-width: 480px;
+ overflow: hidden;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+ padding: 0 30px;
}
-#js-copy-hack,
-#loading pre,
-#help .container,
-#changelog .container,
-.header .title,
-.header .topic,
-#chat .messages {
- user-select: text;
- cursor: text;
+::-moz-placeholder {
+ color: rgba(0, 0, 0, .35);
+ opacity: 1;
}
-#js-copy-hack {
- position: absolute;
- left: -999999px;
+::-webkit-input-placeholder {
+ color: rgba(0, 0, 0, .35);
}
-#chat #js-copy-hack .msg[data-type="condensed"]:not(.closed) .msg,
-#chat #js-copy-hack > .msg {
- display: block;
-}
-
-.only-copy {
- font-size: 0;
- opacity: 0;
- width: 0.01px; /* Must be non-zero to be the first selected character on Firefox */
- display: inline-block;
+:-ms-input-placeholder {
+ color: rgba(0, 0, 0, .35) !important;
}
/* Icons */
-#viewport .lt::before,
-#viewport .rt::before,
-#chat button.mentions::before,
-#chat button.close::before,
-#chat button.menu::before,
-#chat button.search::before,
-.channel-list-item::before,
+#viewport .lt:before,
+#viewport .rt:before,
+#chat button.menu:before,
+#sidebar .chan:before,
+#chat .title:before,
#footer .icon,
-#chat .count::before,
-#connect .extra-help,
-#settings .extra-help,
-#settings #play::before,
-#settings .settings-menu .icon::before,
-#form #upload::before,
-#form #submit::before,
-#chat .msg[data-type="away"] .from::before,
-#chat .msg[data-type="back"] .from::before,
-#chat .msg[data-type="invite"] .from::before,
-#chat .msg[data-type="join"] .from::before,
-#chat .msg[data-type="kick"] .from::before,
-#chat .msg[data-type="login"] .from::before,
-#chat .msg[data-type="logout"] .from::before,
-#chat .msg[data-type="part"] .from::before,
-#chat .msg[data-type="quit"] .from::before,
-#chat .msg[data-type="topic"] .from::before,
-#chat .msg[data-type="mode_channel"] .from::before,
-#chat .msg[data-type="mode_user"] .from::before,
-#chat .msg[data-type="mode"] .from::before,
-#chat .msg[data-command="motd"] .from::before,
-#chat .msg[data-command="help"] .from::before,
-#chat .msg[data-command="info"] .from::before,
-#chat .msg[data-type="ctcp"] .from::before,
-#chat .msg[data-type="ctcp_request"] .from::before,
-#chat .msg[data-type="whois"] .from::before,
-#chat .msg[data-type="nick"] .from::before,
-#chat .msg[data-type="chghost"] .from::before,
-#chat .msg[data-type="action"] .from::before,
-#chat .msg[data-type="plugin"] .from::before,
-#chat .msg[data-type="raw"] .from::before,
-#chat .msg-statusmsg span::before,
-#chat .msg-shown-in-active span::before,
-#chat .toggle-button::after,
-#chat .toggle-content .more-caret::before,
-#chat .scroll-down-arrow::after,
-#chat .topic-container .save-topic span::before,
-#version-checker::before,
-.context-menu-item::before,
-#help .website-link::before,
-#help .documentation-link::before,
-#help .report-issue-link::before,
-#image-viewer .previous-image-btn::before,
-#image-viewer .next-image-btn::before,
-#image-viewer .open-btn::before,
-.channel-list-item .not-secure-icon::before,
-.channel-list-item .not-connected-icon::before,
-.channel-list-item .parted-channel-icon::before,
-.jump-to-input::before,
-.password-container .reveal-password span,
-#sidebar .collapse-network-icon::before {
+#chat .count:before,
+#settings #play:before,
+#form #submit:before,
+#chat .invite .from:before,
+#chat .join .from:before,
+#chat .kick .from:before,
+#chat .part .from:before,
+#chat .quit .from:before,
+#chat .topic .from:before,
+#chat .mode .from:before,
+#chat .ctcp .from:before,
+#chat .whois .from:before,
+#chat .nick .from:before,
+#chat .action .from:before,
+.context-menu-item:before {
font: normal normal normal 14px/1 FontAwesome;
font-size: inherit; /* Can't have font-size inherit on line above, so need to override */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
-#viewport .lt::before { content: "\f0c9"; /* http://fontawesome.io/icon/bars/ */ }
-#viewport .rt::before { content: "\f0c0"; /* https://fontawesome.com/icons/users?style=solid */ }
-#chat button.menu::before { content: "\f142"; /* http://fontawesome.io/icon/ellipsis-v/ */ }
-#chat button.mentions::before { content: "\f1fa"; /* https://fontawesome.com/icons/at?style=solid */ }
-#chat button.search::before { content: "\f002"; /* https://fontawesome.com/icons/search?style=solid */ }
-#chat button.close::before { content: "\f00d"; /* https://fontawesome.com/icons/times?style=solid */ }
+#viewport .lt:before { content: "\f0c9"; /* http://fontawesome.io/icon/bars/ */ }
+#viewport .rt:before { content: "\f0c0"; /* http://fontawesome.io/icon/users/ */ }
+#chat button.menu:before { content: "\f142"; /* http://fontawesome.io/icon/ellipsis-v/ */ }
-.context-menu-join::before { content: "\f067"; /* http://fontawesome.io/icon/plus/ */ }
-.context-menu-user::before { content: "\f007"; /* http://fontawesome.io/icon/user/ */ }
-.context-menu-close::before { content: "\f00d"; /* http://fontawesome.io/icon/times/ */ }
-.context-menu-list::before { content: "\f03a"; /* http://fontawesome.io/icon/list/ */ }
-.context-menu-disconnect::before { content: "\f127"; /* https://fontawesome.com/icons/unlink?style=solid */ }
-.context-menu-connect::before { content: "\f0c1"; /* https://fontawesome.com/icons/link?style=solid */ }
-.context-menu-action-whois::before { content: "\f05a"; /* http://fontawesome.io/icon/info-circle/ */ }
-.context-menu-action-ignore::before { content: "\f506"; /* https://fontawesome.com/icons/user-slash?style=solid */ }
-.context-menu-action-kick::before { content: "\f05e"; /* http://fontawesome.io/icon/ban/ */ }
-.context-menu-action-set-mode::before { content: "\f067"; /* http://fontawesome.io/icon/plus/ */ }
-.context-menu-action-revoke-mode::before { content: "\f068"; /* http://fontawesome.io/icon/minus/ */ }
-.context-menu-network::before { content: "\f233"; /* https://fontawesome.com/icons/server?style=solid */ }
-.context-menu-edit::before { content: "\f303"; /* https://fontawesome.com/icons/pencil-alt?style=solid */ }
-.context-menu-clear-history::before { content: "\f1f8"; /* https://fontawesome.com/icons/trash?style=solid */ }
-.context-menu-mute::before { content: "\f6a9"; /* https://fontawesome.com/v5.15/icons/volume-mute?style=solid */ }
+.context-menu-user:before { content: "\f007"; /* http://fontawesome.io/icon/user/ */ }
+.context-menu-chan:before { content: "\f0f6"; /* http://fontawesome.io/icon/file-text-o/ */ }
+.context-menu-close:before { content: "\f00d"; /* http://fontawesome.io/icon/times/ */ }
-.channel-list-item .not-secure-icon::before {
- content: "\f071"; /* https://fontawesome.com/icons/exclamation-triangle?style=solid */
-}
+#sidebar .chan.lobby:before,
+#chat .lobby .title:before { content: "\f0a0"; /* http://fontawesome.io/icon/hdd-o/ */ }
-.channel-list-item .not-connected-icon::before,
-.channel-list-item .parted-channel-icon::before {
- content: "\f127"; /* https://fontawesome.com/icons/unlink?style=solid */
-}
+#sidebar .chan.query:before,
+#chat .query .title:before { content: "\f0e6"; /* http://fontawesome.io/icon/comments-o/ */ }
-.context-menu-query::before,
-.context-menu-action-query::before,
-.channel-list-item[data-type="query"]::before {
- content: "\f075"; /* https://fontawesome.com/icons/comment?style=solid */
-}
+#sidebar .chan.channel:before,
+#chat .channel .title:before { content: "\f0f6"; /* http://fontawesome.io/icon/file-text-o/ */ }
-.context-menu-chan::before,
-.channel-list-item[data-type="channel"]::before { content: "\f086"; /* http://fontawesome.io/icon/comments/ */ }
+#footer .sign-in:before { content: "\f023"; /* http://fontawesome.io/icon/lock/ */ }
+#footer .connect:before { content: "\f067"; /* http://fontawesome.io/icon/plus/ */ }
+#footer .settings:before { content: "\f013"; /* http://fontawesome.io/icon/cog/ */ }
+#footer .sign-out:before { content: "\f011"; /* http://fontawesome.io/icon/power-off/ */ }
-.channel-list-item[data-type="special"]::before { content: "\f03a"; /* http://fontawesome.io/icon/list/ */ }
+#form #submit:before { content: "\f1d8"; /* http://fontawesome.io/icon/paper-plane/ */ }
-.channel-list-item.has-draft:not(.active):not([data-type="lobby"])::before {
- content: "\f304"; /* https://fontawesome.com/icons/pen?style=solid */
-}
-
-#footer .connect::before { content: "\f067"; /* http://fontawesome.io/icon/plus/ */ }
-
-#footer .settings::before { content: "\f013"; /* http://fontawesome.io/icon/cog/ */ }
-
-#footer .help::before { content: "\f059"; /* http://fontawesome.io/icon/question/ */ }
-
-#form #upload::before { content: "\f0c6"; /* https://fontawesome.com/icons/paperclip?style=solid */ }
-#form #submit::before { content: "\f1d8"; /* http://fontawesome.io/icon/paper-plane/ */ }
-
-#chat .msg[data-type="away"] .from::before,
-#chat .msg[data-type="back"] .from::before {
- content: "\f017"; /* https://fontawesome.com/icons/clock?style=solid */
- color: #7f8c8d;
-}
-
-#help .website-link::before,
-#help .documentation-link::before,
-#help .report-issue-link::before {
- display: inline-block;
- margin-right: 5px;
-
- /* These 2 directives are loosely taken from .fa-fw */
- width: 1.35em;
- text-align: center;
-}
-
-#help .website-link::before { content: "\f0ac"; /* http://fontawesome.io/icon/globe/ */ }
-#help .documentation-link::before { content: "\f19d"; /* http://fontawesome.io/icon/graduation-cap/ */ }
-#help .report-issue-link::before { content: "\f188"; /* http://fontawesome.io/icon/bug/ */ }
-
-#chat .msg[data-type="invite"] .from::before {
- content: "\f0e0"; /* https://fontawesome.com/icons/envelope?style=solid */
+#chat .invite .from:before {
+ content: "\f003"; /* http://fontawesome.io/icon/envelope-o/ */
color: #2ecc40;
}
-#chat .msg[data-type="login"] .from::before {
- content: "\f007"; /* https://fontawesome.com/icons/user?style=solid */
- color: #2ecc40;
-}
-
-#chat .msg[data-type="logout"] .from::before {
- content: "\f007"; /* https://fontawesome.com/icons/user?style=solid */
- color: #ff4136;
-}
-
-#chat .msg[data-type="part"] .from::before,
-#chat .msg[data-type="quit"] .from::before {
- content: "\f2f5"; /* https://fontawesome.com/icons/sign-out-alt?style=solid */
+#chat .part .from:before,
+#chat .quit .from:before {
+ content: "\f08b"; /* http://fontawesome.io/icon/sign-out/ */
color: #ff4136;
display: inline-block;
transform: rotate(180deg);
}
-#chat .msg[data-type="topic"] .from::before {
+#chat .topic .from:before {
content: "\f0a1"; /* http://fontawesome.io/icon/bullhorn/ */
color: #2ecc40;
}
-#chat .msg[data-type="mode_channel"] .from::before,
-#chat .msg[data-type="mode_user"] .from::before,
-#chat .msg[data-type="mode"] .from::before {
+#chat .mode .from:before {
content: "\f05a"; /* http://fontawesome.io/icon/info-circle/ */
color: #2ecc40;
}
-#chat .msg[data-command="motd"] .from::before {
- content: "\f02e"; /* https://fontawesome.com/icons/bookmark?style=solid */
- color: var(--body-color-muted);
+#chat .ctcp .from:before {
+ content: "\f0f6"; /* http://fontawesome.io/icon/file-text-o/ */
}
-#chat .msg[data-command="help"] .from::before {
- content: "\f059"; /* https://fontawesome.com/icons/question-circle?style=solid */
- color: var(--body-color-muted);
-}
-
-#chat .msg[data-command="info"] .from::before {
- content: "\f05a"; /* https://fontawesome.com/icons/info-circle?style=solid */
- color: var(--body-color-muted);
-}
-
-#chat .msg[data-type="ctcp"] .from::before,
-#chat .msg[data-type="ctcp_request"] .from::before {
- content: "\f15c"; /* https://fontawesome.com/icons/file-alt?style=solid */
- color: var(--body-color-muted);
-}
-
-#chat .msg[data-type="whois"] .from::before {
+#chat .whois .from:before {
content: "\f007"; /* http://fontawesome.io/icon/user/ */
color: #2ecc40;
}
-#chat .msg[data-type="nick"] .from::before,
-#chat .msg[data-type="chghost"] .from::before {
+#chat .nick .from:before {
content: "\f007"; /* http://fontawesome.io/icon/user/ */
color: #2ecc40;
}
-#chat .msg[data-type="join"] .from::before {
- content: "\f2f6"; /* https://fontawesome.com/icons/sign-in-alt?style=solid */
+#chat .join .from:before {
+ content: "\f090"; /* http://fontawesome.io/icon/sign-in/ */
color: #2ecc40;
}
-#chat .msg[data-type="kick"] .from::before {
+#chat .kick .from:before {
content: "\f05e"; /* http://fontawesome.io/icon/ban/ */
color: #ff4136;
}
-#chat .msg[data-type="raw"] .from::before {
- content: "\f101"; /* https://fontawesome.com/icons/angle-double-right?style=solid */
-}
-
-#chat .msg.self[data-type="raw"] .from::before {
- content: "\f359"; /* https://fontawesome.com/icons/arrow-alt-circle-left?style=solid */
- color: #2ecc40;
-}
-
-#chat .msg[data-type="action"] .from::before {
+#chat .action .from:before {
content: "\f005"; /* http://fontawesome.io/icon/star/ */
}
-#chat .msg[data-type="plugin"] .from::before {
- content: "\f1e6"; /* http://fontawesome.io/icon/plug/ */
- transform: rotate(45deg);
- display: inline-block;
- padding: 1px;
-}
-
-#chat .msg-statusmsg,
-#chat .msg-shown-in-active {
- cursor: help;
- margin-right: 5px;
-}
-
-#chat .msg-statusmsg span::before,
-#chat .msg-shown-in-active span::before {
- font-size: 10px;
- content: "\f06e"; /* https://fontawesome.com/icons/eye?style=solid */
-}
-
-#chat .msg-statusmsg {
- border-radius: 2px;
- padding: 2px 4px;
- background-color: #ff9e18;
- color: #222;
-}
-
-#chat .toggle-button {
- display: inline-block;
- transition: opacity 0.2s, transform 0.2s;
-
- /* These 2 directives are loosely taken from .fa-fw */
- width: 1.35em;
- text-align: center;
-}
-
-#chat .toggle-button::after {
- content: "\f0da"; /* http://fontawesome.io/icon/caret-right/ */
-}
-
-#chat .count::before {
+#chat .count:before {
color: #cfcfcf;
content: "\f002"; /* http://fontawesome.io/icon/search/ */
position: absolute;
- right: 13px;
- line-height: 45px;
+ right: 18px;
+ font-size: 14px;
+ line-height: 50px;
}
-#connect .extra-help::before,
-#settings .extra-help::before {
- content: "\f059"; /* http://fontawesome.io/icon/question-circle/ */
-}
-
-#settings #play::before {
+#settings #play:before {
content: "\f028"; /* http://fontawesome.io/icon/volume-up/ */
margin-right: 9px;
}
-#image-viewer .previous-image-btn::before {
- content: "\f104"; /* http://fontawesome.io/icon/angle-left/ */
-}
-
-#image-viewer .next-image-btn::before {
- content: "\f105"; /* http://fontawesome.io/icon/angle-right/ */
-}
-
-#image-viewer .open-btn::before {
- content: "\f35d"; /* https://fontawesome.com/icons/external-link-alt?style=solid */
-}
-
/* End icons */
-#app {
+#wrap {
height: 100%;
- width: 100%;
+ overflow: hidden;
}
#viewport {
- display: flex;
height: 100%;
-}
-
-#form button,
-.header button,
-.reveal-password span {
- transition: opacity 0.2s;
-}
-
-#form button:hover,
-.header button:hover,
-.reveal-password span:hover {
- opacity: 0.6;
+ transition: all .4s;
+ -webkit-transform: translateZ(0);
+ transform: translateZ(0);
+ -webkit-perspective: 1000;
+ perspective: 1000;
}
#viewport .lt,
#viewport .rt,
-#chat button.mentions,
-#chat button.search,
-#chat button.menu,
-#chat button.close {
- color: #607992;
- display: flex;
+#chat button.menu {
+ color: #ccc;
+ display: none;
+ float: left;
font-size: 14px;
line-height: 1;
height: 36px;
+ margin: 6px 12px 0 -12px;
width: 36px;
- flex-shrink: 0;
}
-#viewport .lt::before,
-#viewport .rt::before,
-#chat button.mentions::before,
-#chat button.search::before,
-#chat button.menu::before,
-#chat button.close::before {
- width: 36px;
- line-height: 36px; /* Fix alignment in Microsoft Edge */
-}
-
-/* Channel list button stays fixed when scrolling... */
#viewport .lt {
- position: fixed;
-}
-
-/* ... Except on chat windows, relative to include the notification dot */
-#viewport #chat .lt {
position: relative;
}
/* Notification dot on the top right corner of the menu icon */
-#viewport .lt::after {
+#viewport .lt:after {
content: "";
position: absolute;
top: 9px;
@@ -656,1221 +337,812 @@ p {
width: 10px;
height: 10px;
border-radius: 50%;
- border: 2px solid var(--window-bg-color);
+ border: 2px solid white;
opacity: 0;
- transition: opacity 0.2s;
- background-clip: padding-box; /* Fix border-radius bleeding color */
+ transition: opacity .2s;
}
-#viewport.notified .lt::after {
+#viewport .lt.notified:after {
opacity: 1;
}
-#viewport.userlist-open #chat .userlist {
- display: flex;
+#viewport .rt {
+ display: block;
+ float: right;
+ margin: 6px -12px 0 0;
+}
+
+#chat button.menu {
+ display: block;
+ float: right;
+ margin: 6px -8px 0 12px;
+}
+
+#viewport.rt #chat .sidebar {
+ -webkit-transform: translate3d(180px, 0, 0);
+ transform: translate3d(180px, 0, 0);
}
#sidebar {
- display: none;
- flex-direction: column;
- width: 220px;
- max-height: 100%;
- will-change: transform;
- color: #b7c5d1; /* same as .channel-list-item color */
-}
-
-#viewport.menu-open #sidebar {
- display: flex;
-}
-
-#sidebar .scrollable-area {
- overflow-x: auto;
- flex-grow: 1;
- touch-action: pan-y;
- scrollbar-width: thin;
- overscroll-behavior: contain;
+ bottom: 52px;
+ left: 0;
+ overflow: auto;
+ overflow-x: hidden;
-webkit-overflow-scrolling: touch;
+ position: absolute;
+ top: 0;
+ width: 220px;
}
-#sidebar .logo-container {
- text-align: center;
-}
-
-#sidebar .logo,
-#sidebar .logo-inverted {
- height: 45px;
-}
-
-#sidebar .logo {
- display: none;
-}
-
-.channel-list-item,
-#sidebar .empty {
+#sidebar button,
+#sidebar .chan,
+#sidebar .sign-out {
+ border: 1px solid transparent;
+ border-radius: 2px;
+ color: #99a2b4;
+ cursor: pointer;
font-size: 14px;
}
-.channel-list-item {
- display: flex;
- padding: 8px 14px;
- position: relative;
- cursor: pointer;
-}
-
-/* Channels/queries must be white on hover and active */
-#footer button:hover,
-#footer button.active,
-.channel-list-item:hover,
-.channel-list-item.active {
+#sidebar button:hover,
+#sidebar .chan:hover,
+#sidebar .active {
color: #fff;
}
-/* All lobbies/channels/queries and footer buttons must have a half-transparent
-background on hover (unless active) */
-.channel-list-item:hover,
-#footer button:hover {
- background-color: rgb(48 62 74 / 50%); /* #303e4a x 50% alpha */
+#sidebar .networks {
+ padding: 20px 30px 0;
}
-/* Darker background and default cursor for active channels */
-#footer button.active,
-.channel-list-item.active {
- background-color: #303e4a;
- cursor: default;
+#sidebar .networks:empty {
+ padding: 0;
}
-/* Remove background on hovered/active channel when sorting/drag-and-dropping */
-.ui-sortable-ghost,
-.ui-sortable-dragging .channel-list-item,
-.ui-sortable-dragging,
-.ui-sortable-dragging:hover,
-.ui-sortable-dragging.active,
-.ui-sortable-dragging-touch-cue .channel-list-item,
-.ui-sortable-dragging-touch-cue,
-.ui-sortable-dragging-touch-cue:hover,
-.ui-sortable-dragging-touch-cue.active {
- background: transparent;
-}
-
-.ui-sortable-ghost::after,
-.ui-sortable-dragging-touch-cue:not(.ui-sortable-dragging)::after {
- background: var(--body-bg-color);
- border: 1px dashed #99a2b4;
- border-radius: 6px;
- content: " ";
- display: block;
- position: absolute;
- left: 10px;
- top: 0;
- bottom: 0;
- right: 10px;
-}
-
-.ui-sortable-dragging-touch-cue:not(.ui-sortable-ghost)::after {
- background: transparent;
-}
-
-#sidebar .network {
- position: relative;
- margin-bottom: 20px;
- touch-action: pan-y;
+#sidebar .network,
+#sidebar .network-placeholder {
+ margin-bottom: 30px;
}
#sidebar .empty {
- flex-grow: 1;
+ color: #9ca5b4;
line-height: 1.6;
- padding: 40px 20px;
+ font-size: 12px;
+ margin-top: 20px;
+ padding: 20px 40px;
text-align: center;
}
-.channel-list-item[data-type="lobby"] {
+#sidebar .chan,
+#sidebar .chan-placeholder {
+ display: block;
+ margin: 1px -10px;
+ padding: 6px 10px 8px 36px;
+ position: relative;
+ text-align: left;
+ transition: color .2s;
+ width: 180px;
+}
+
+#sidebar .chan-placeholder {
+ padding-bottom: 10px;
+}
+
+#sidebar .chan:first-child {
color: #84ce88;
font-size: 15px;
font-weight: bold;
- padding-left: 0;
}
-.channel-list-item .lobby-wrap {
- display: flex;
- flex-grow: 1;
- overflow: hidden;
-}
-
-.channel-list-item[data-type="lobby"]:hover,
-.channel-list-item[data-type="lobby"].active {
+#sidebar .chan:first-child:hover,
+#sidebar .chan:first-child.active {
color: #c0f8c3;
}
-.channel-list-item .not-connected-tooltip,
-.channel-list-item .not-secure-tooltip,
-.channel-list-item .parted-channel-tooltip {
- margin: 0 8px;
-}
-
-.channel-list-item.not-secure {
- color: #f39c12;
-}
-
-.channel-list-item.not-secure:hover,
-.channel-list-item.not-secure.active {
- color: #f8c572;
-}
-
-.channel-list-item.not-connected,
-.channel-list-item.parted-channel {
- color: #e74c3c;
-}
-
-.channel-list-item.not-connected:hover,
-.channel-list-item.not-connected.active,
-.channel-list-item.parted-channel:hover,
-.channel-list-item.parted-channel.active {
- color: #f1978e;
-}
-
-.channel-list-item.is-muted {
- opacity: 0.5;
-}
-
-.channel-list-item::before {
- width: 14px;
+#sidebar .chan:before,
+#chat .title:before {
+ float: left;
+ margin-top: 3px;
margin-right: 12px;
- line-height: 18px;
+ text-align: center;
}
-.channel-list-item .name {
+#sidebar .chan:before {
+ position: absolute;
+ top: 4px;
+ left: 10px;
+}
+
+#chat .title:before {
+ margin-top: 17px;
+}
+
+#sidebar .chan .name {
position: relative;
- flex-grow: 1;
+ z-index: 0;
+ display: block;
overflow: hidden;
white-space: nowrap;
margin-right: 5px;
}
-.header .topic,
-.channel-list-item .name {
- mask-image: linear-gradient(to left, transparent, black 20px);
+#sidebar .chan .name:after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ width: 20px;
+ background: linear-gradient(to right, rgba(69, 81, 100, 0) 0%, rgba(69, 81, 100, 1) 100%);
+ content: " ";
}
-.channel-list-item .badge,
-#sidebar .add-channel-tooltip,
-.channel-list-item .close-tooltip {
- flex-shrink: 0;
- line-height: 1;
-}
-
-.channel-list-item .badge {
- background: rgb(255 255 255 / 6%);
+#sidebar .badge {
+ background: rgba(255, 255, 255, .06);
border-radius: 3px;
color: #afb6c0;
font-size: 10px;
- padding: 4px 6px;
- transition: background-color 0.2s, color 0.2s;
+ margin-top: 1px;
+ margin-right: -5px;
+ margin-left: 5px;
+ padding: 3px 6px;
+ float: right;
+ transition: opacity .2s, background-color .2s, color .2s;
}
-.channel-list-item .badge:empty {
- display: none;
-}
-
-.channel-list-item .badge.highlight {
+#sidebar .badge.highlight {
background: #fff;
color: #49505a;
}
-.channel-list-item .close {
- width: 18px;
- height: 18px;
- display: none;
- transition: opacity 0.2s, background-color 0.2s;
+#sidebar .chan.active .badge,
+#sidebar .badge:empty {
+ opacity: 0;
}
-.channel-list-item .close::before {
- font-size: 20px;
+#sidebar .close {
+ border-radius: 3px;
+ margin-right: 5px;
+ visibility: hidden;
+ opacity: 0;
+ position: absolute;
+ z-index: 2;
+ right: 0;
+ transition: opacity .2s, background-color .2s;
+}
+
+#sidebar .close:before {
+ font-size: 18px;
font-weight: normal;
display: inline-block;
- line-height: 16px;
+ line-height: 18px;
+ width: 18px;
+ height: 18px;
text-align: center;
content: "×";
color: #fff;
}
-.channel-list-item.active .close {
- opacity: 0.4;
- display: unset;
+#sidebar .chan.active .close {
+ visibility: visible;
+ opacity: .4;
}
-.channel-list-item.active .close:hover {
+#sidebar .chan.active .close:hover {
+ background-color: rgba(0, 0, 0, .1);
opacity: 1;
}
-.channel-list-item[data-type="lobby"] .add-channel {
- border-radius: 3px;
- width: 18px;
- height: 18px;
- opacity: 0.4;
- transition: opacity 0.2s, background-color 0.2s, transform 0.2s;
+#sidebar .tse-scrollbar {
+ top: 2px;
+ right: 3px;
}
-.channel-list-item[data-type="lobby"] .add-channel::before {
- font-size: 20px;
- font-weight: normal;
- display: inline-block;
- line-height: 16px;
- text-align: center;
- content: "+";
- color: #fff;
-}
-
-.channel-list-item[data-type="lobby"] .add-channel:hover {
- opacity: 1;
-}
-
-.channel-list-item[data-type="lobby"] .add-channel.opened {
- /* translateZ(0) enables hardware acceleration, this is to avoid jittering when animating */
- transform: rotate(45deg) translateZ(0);
-}
-
-#sidebar .network .collapse-network {
- width: 40px;
- opacity: 0.4;
- padding-left: 11px;
- transition: opacity 0.2s;
- flex-shrink: 0;
-}
-
-#sidebar .network .collapse-network-icon {
- display: block;
- width: 20px;
- height: 20px;
- transition: transform 0.2s;
-}
-
-#sidebar .network.collapsed .collapse-network-icon {
- transform: rotate(-90deg);
-}
-
-#sidebar .network .collapse-network-icon::before {
- content: "\f0d7"; /* http://fontawesome.io/icon/caret-down/ */
- color: #fff;
-}
-
-#sidebar .collapse-network:hover {
- opacity: 1;
+#sidebar,
+#footer {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
}
#footer {
+ background: rgba(0, 0, 0, .06);
+ border-radius: 2px;
+ bottom: 4px;
height: 45px;
+ left: 5px;
font-size: 14px;
- flex-shrink: 0;
- display: flex;
- justify-content: center;
-}
-
-#footer button {
- color: #b7c5d1;
- display: inline-block;
- width: 45px;
- height: 100%;
- border-radius: 5px;
-}
-
-#footer .help.notified::after {
- content: "\f021";
+ line-height: 45px;
position: absolute;
- bottom: 10px;
- right: 7px;
- padding: 2px;
- font-size: 10px;
- border-radius: 50%;
- color: var(--link-color);
- background: var(--body-bg-color);
+ text-align: center;
+ width: 210px;
}
-.window li,
-.window p,
-.window label,
-#settings .error {
+#footer button.active {
+ color: #fff;
+}
+
+#footer .icon {
+ color: #9ca5b4;
+ display: inline-block;
+ line-height: 34px;
+ padding: 0 12px;
+}
+
+.signed-out #footer .sign-in {
+ display: inline-block;
+}
+
+.signed-out #footer .connect,
+.signed-out #footer .sign-out {
+ display: none;
+}
+
+.public #footer .sign-in,
+.public #footer .sign-out {
+ display: none;
+}
+
+#footer .sign-in {
+ display: none;
+}
+
+#main {
+ background: #fff;
+ border-radius: 2px;
+ bottom: 4px;
+ left: 220px;
+ overflow: hidden; /* Without this, border-radius has no effect */
+ position: absolute;
+ right: 5px;
+ top: 4px;
+ display: flex;
+ flex-direction: column;
+}
+
+.signed-out #main {
+ left: 5px;
+}
+
+#header {
+ display: none;
+ height: 40px;
+ position: absolute;
+ top: 0;
+ width: 100%;
+}
+
+#windows label {
font-size: 14px;
}
-.input {
- background-color: white;
+#windows .input {
border: 1px solid #cdd3da;
border-radius: 2px;
color: #222;
font-size: 14px;
margin: 2px 0;
margin-bottom: 10px;
- padding: 0 10px;
- transition: border-color 0.2s, box-shadow 0.2s;
+ outline: 0;
+ padding: 8px 10px;
+ transition: border-color .2s;
+ -webkit-appearance: none;
width: 100%;
- height: 35px;
- line-height: 35px;
}
-.input:disabled {
- background-color: #ddd;
-}
-
-.input:not(:disabled):hover,
-.input:not(:disabled):focus {
- border-color: #84ce88;
-}
-
-textarea.input {
+#user-specified-css-input {
resize: vertical;
- min-height: 35px;
- padding: 6px 10px;
- line-height: 1.5;
}
-.window {
- background: var(--window-bg-color);
- display: flex;
- flex-direction: column;
- flex: 1 1 auto;
+#windows .input:hover,
+#windows .input:focus {
+ border-color: #79838c;
+}
+
+#windows .window:before {
+ background: #f4f4f4;
+ background-image: linear-gradient(#f4f4f4, #ececec);
+ border-bottom: 1px solid #d7d7d7;
+ content: " ";
+ display: block;
+ height: 10px;
position: relative;
+ z-index: 10;
+}
+
+#windows .window {
+ background: #fff;
+ bottom: 0;
+ display: none;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
overflow-y: auto;
- height: 100%;
- scrollbar-width: thin;
- overscroll-behavior: contain;
-webkit-overflow-scrolling: touch;
}
-#loading,
-#chat .chat-view {
- /* flexbox does not seem to scroll without doing this */
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- top: 0;
+#windows .window h1 {
+ font: 36px Lato;
}
-.window h1 {
- font-size: 36px;
-}
-
-.window h2 {
- border-bottom: 1px solid currentcolor;
- color: var(--window-heading-color);
+#windows .window h2 {
+ border-bottom: 1px solid #eee;
+ color: #7f8c8d;
font-size: 22px;
margin: 30px 0 10px;
padding-bottom: 7px;
}
-.window h2 small {
- font-size: 16px;
- line-height: 30px;
+#windows .active {
+ display: block;
}
-.window h3 {
- color: var(--window-heading-color);
- font-size: 18px;
- margin: 20px 0 10px;
-}
-
-.header {
- align-items: center;
- line-height: 45px;
- height: 45px;
- padding: 0 6px;
- display: flex;
- flex-shrink: 0;
- overflow: hidden;
-}
-
-#chat .header {
+#windows .header {
border-bottom: 1px solid #e7e7e7;
-}
-
-.header .title {
- font-size: 15px;
- padding-left: 6px;
- flex-shrink: 1;
- white-space: nowrap;
+ line-height: 50px !important;
+ height: 48px;
+ padding: 0 20px;
overflow: hidden;
- text-overflow: ellipsis;
}
-.topic-container {
- position: relative;
- flex-grow: 1;
- padding-left: 10px;
+#windows .header .title {
+ font: 14px Lato;
}
-.header .topic {
- color: var(--body-color-muted);
+#windows .header .topic {
+ color: #777;
margin-left: 8px;
word-break: break-all;
- flex-grow: 1;
- overflow: hidden;
- font-size: 14px;
- flex-shrink: 99999999;
- min-width: 25px;
}
-.header .topic.empty {
- min-width: 0;
+#windows .window .header {
+ display: none;
}
-.header .topic-input {
- color: inherit;
- background: transparent;
- border: 1px solid #cdd3da;
- border-radius: 2px;
- padding-right: 37px;
- padding-left: 10px;
- width: 100%;
- height: 35px;
- overflow: hidden;
- font-size: 14px;
- line-height: normal;
- outline: none;
-}
-
-.topic-container .save-topic {
+#chat-container,
+#chat .chan {
position: absolute;
- top: 6px;
+ top: 0;
right: 0;
+ bottom: 0;
+ left: 0;
}
-.topic-container .save-topic span {
- font-size: 16px;
- color: #607992;
- width: 35px;
- height: 35px;
+#windows #chat-container.active {
display: flex;
- justify-content: center;
- align-items: center;
- cursor: pointer;
- appearance: none;
-}
-
-.topic-container .save-topic span:hover {
- opacity: 0.6;
+ flex-direction: column;
}
#chat {
- overflow: hidden;
- flex: 1 0 auto;
position: relative;
-}
-
-#chat .chat-view {
- display: flex;
- flex-direction: column;
-}
-
-#chat .msg[data-type="condensed"] {
- flex-wrap: wrap;
-}
-
-#chat .msg[data-type="condensed"] .content {
+ overflow: hidden;
flex: 1;
}
-/* Ensures expanded status messages always take up the full width */
-#chat .msg[data-type="condensed"] .msg {
- flex-basis: 100%;
-}
-
-#chat .condensed-summary .content {
- display: block;
- cursor: pointer;
- user-select: none;
-}
-
-#chat .condensed-summary {
- display: flex;
-}
-
-#chat .condensed-summary .content:hover {
- text-decoration: underline;
-}
-
-#chat .msg.closed[data-type="condensed"] .msg {
+#chat .chan {
display: none;
}
-#chat .condensed-summary .time {
- visibility: hidden;
+#chat .chan.active {
+ display: block;
}
-#form,
-.messages .msg,
-.userlist {
- font-size: 14px;
+#chat,
+#windows .header {
+ font: 12px Consolas, Menlo, Monaco, "Lucida Console", "DejaVu Sans Mono", "Courier New", monospace;
line-height: 1.4;
}
-#chat .chat-content {
- display: flex;
- flex-direction: row-reverse;
- flex-grow: 1;
- overflow: hidden;
- position: relative;
+#windows #chat .header {
+ display: block;
+}
+
+#chat .chat,
+#chat .sidebar {
+ top: 48px;
}
#chat .chat {
+ bottom: 0;
+ left: 0;
overflow: auto;
- overflow-x: hidden;
- display: flex;
- flex-grow: 1;
- flex-direction: column;
- scrollbar-width: thin;
- overscroll-behavior: contain;
-webkit-overflow-scrolling: touch;
- outline: none;
+ position: absolute;
+ right: 180px;
}
-#chat .userlist {
+#viewport.rt .chat {
+ right: 0;
+}
+
+#chat .sidebar {
+ background: #fff;
border-left: 1px solid #e7e7e7;
+ bottom: 0;
+ position: absolute;
+ right: 0;
width: 180px;
+ transition: all .4s;
+ -webkit-transform: translateZ(0);
+ transform: translateZ(0);
+ -webkit-perspective: 1000;
+ perspective: 1000;
+}
+
+#chat .lobby .chat,
+#chat .query .chat {
+ right: 0;
+}
+
+#chat .lobby .sidebar,
+#chat .query .sidebar {
display: none;
- flex-direction: column;
- flex-shrink: 0;
- touch-action: pan-y;
-}
-
-/**
- * Toggled via JavaScript
- */
-#sidebar .join-form {
- padding: 0 18px 8px;
-}
-
-#sidebar .join-form .input {
- display: block;
- margin: 5px auto;
-}
-
-#sidebar .join-form .btn {
- display: block;
- width: 100%;
- margin: auto;
}
#chat .show-more {
+ display: none;
padding: 10px;
- padding-top: 15px;
padding-bottom: 0;
width: 100%;
}
-#chat .show-more .btn {
+#chat .show-more-button {
+ background: #f4f4f4;
+ background-image: linear-gradient(#f4f4f4, #ececec);
+ border: 1px solid #d7d7d7;
+ border-bottom-color: #b7b7b7;
+ border-radius: 2px;
+ color: #555;
+ font: 12px Lato, sans-serif;
+ height: 34px;
+ line-height: 0;
width: 100%;
- margin: 0;
}
-.scroll-down {
- position: absolute;
- bottom: 16px;
- right: 16px;
- z-index: 2;
- pointer-events: none;
- opacity: 0;
- transform: translateY(16px);
- transition: transform 0.2s, opacity 0.2s;
- cursor: pointer;
-}
-
-.scroll-down-shown {
+#chat .show-more-button:hover {
opacity: 1;
- transform: none;
- pointer-events: auto;
-}
-
-.scroll-down-arrow {
- width: 36px;
- height: 36px;
- line-height: 34px;
- border-radius: 50%;
- background: var(--window-bg-color);
- color: var(--button-color);
- border: 2px solid var(--button-color);
- text-align: center;
- transition: background 0.2s, color 0.2s;
- box-shadow: 0 6px 10px 0 rgb(0 0 0 / 15%);
-}
-
-.scroll-down:hover .scroll-down-arrow {
- background: var(--button-color);
- color: var(--button-text-color-hover);
-}
-
-.scroll-down-arrow::after {
- content: "\f107"; /* https://fontawesome.com/icons/angle-down?style=solid */
-}
-
-.userlist-open .chat-view[data-type="channel"] .scroll-down {
- right: 196px;
}
#chat .messages {
+ display: table;
+ table-layout: fixed;
+ width: 100%;
padding: 10px 0;
- touch-action: pan-y;
-}
-
-#chat .chat-view:not([data-type="special"]) .messages {
- margin-top: auto;
}
#chat .msg {
word-wrap: break-word;
- word-break: break-word; /* Webkit-specific */
- display: flex;
- align-items: flex-start;
- position: relative;
}
#chat .unread-marker {
position: relative;
text-align: center;
+ opacity: .5;
margin: 0 10px;
z-index: 0;
- font-weight: bold;
- font-size: 12px;
}
-#chat .unread-marker::before {
+#chat .unread-marker:before {
position: absolute;
z-index: -1;
content: "";
left: 0;
right: 0;
top: 50%;
- border-top: 1px solid var(--unread-marker-color);
+ border-top: 1px solid #e74c3c;
}
-#chat .unread-marker-text::before {
+#chat .unread-marker-text:before {
content: "New messages";
- background-color: var(--window-bg-color);
- color: var(--unread-marker-color);
+ background-color: white;
+ color: #e74c3c;
padding: 0 10px;
+ font: bold 12px Lato;
}
-#chat .date-marker {
- position: relative;
- text-align: center;
- margin: 0 10px;
- z-index: 0;
- font-weight: bold;
- font-size: 12px;
+#chat .unread-marker:last-child {
+ display: none;
}
-#chat .date-marker::before {
- position: absolute;
- z-index: -1;
- content: "";
- left: 0;
- right: 0;
- top: 50%;
- border-top: 1px solid var(--date-marker-color);
-}
-
-#chat .date-marker-text::before {
- content: attr(aria-label);
- background-color: var(--window-bg-color);
- color: var(--date-marker-color);
- padding: 0 10px;
-}
-
-#chat .time,
-#chat .from,
-#chat .content {
- padding: 3px 0;
- flex: 0 0 auto;
-}
-
-#chat .time {
- color: var(--body-color-muted);
- padding-left: 10px;
- width: 55px;
- font-variant-numeric: tabular-nums;
- box-sizing: content-box; /* highlights have a border-left */
-}
-
-#chat.time-12h .time,
-#chat.time-seconds .time {
- width: 75px;
-}
-
-#chat.time-seconds.time-12h .time {
- width: 90px;
-}
-
-#chat .from {
- padding-right: 10px;
- text-align: right;
- width: 134px;
- overflow: hidden;
- white-space: nowrap;
- position: relative;
-}
-
-#chat .content {
- flex: 1 1 auto;
- min-width: 0;
- padding-left: 10px;
- padding-right: 6px;
- border-left: 1px solid #f6f6f6;
- overflow: hidden; /* Prevents Zalgo text to expand beyond messages */
- text-align: left; /* so RTL text will still be aligned left, not right */
-}
-
-#chat .msg[data-type="unhandled"] .from {
- color: var(--body-color-muted);
-}
-
-#chat .chat-view[data-type="special"] table th {
- word-break: normal;
-}
-
-/* Parsed nicks and channels */
-
-#chat .user,
.inline-channel {
cursor: pointer;
}
-.chat .user:hover,
.inline-channel:hover {
- text-decoration: underline;
+ opacity: .6;
+}
+
+#chat .time,
+#chat .from,
+#chat .text {
+ display: table-cell;
+ padding: 2px 0;
+ vertical-align: top;
+}
+
+#chat .time {
+ color: #ddd;
+ text-align: right;
+ max-width: 46px;
+ min-width: 46px;
+}
+
+#chat .from {
+ border-right: 1px solid #f6f6f6;
+ color: #b1c3ce;
+ padding-right: 10px;
+ text-align: right;
+ max-width: 134px;
+ min-width: 134px;
+}
+
+#loading a,
+#chat a {
+ color: #50a656;
}
/* Nicknames */
-.user {
+#chat .user {
+ cursor: pointer;
color: #50a656;
}
-.user.color-1 { color: #107ead; }
-.user.color-2 { color: #a86500; }
-.user.color-3 { color: #008a3c; }
-.user.color-4 { color: #e00096; }
-.user.color-5 { color: #f0000c; }
-.user.color-6 { color: #000094; }
-.user.color-7 { color: #006441; }
-.user.color-8 { color: #00566e; }
-.user.color-9 { color: #e6006b; }
-.user.color-10 { color: #0d8766; }
-.user.color-11 { color: #006b3b; }
-.user.color-12 { color: #00857e; }
-.user.color-13 { color: #00465b; }
-.user.color-14 { color: #eb005a; }
-.user.color-15 { color: #e62600; }
-.user.color-16 { color: #0f8546; }
-.user.color-17 { color: #e60067; }
-.user.color-18 { color: #eb002b; }
-.user.color-19 { color: #eb003f; }
-.user.color-20 { color: #007a56; }
-.user.color-21 { color: #095092; }
-.user.color-22 { color: #000bde; }
-.user.color-23 { color: #008577; }
-.user.color-24 { color: #00367d; }
-.user.color-25 { color: #007e9e; }
-.user.color-26 { color: #006119; }
-.user.color-27 { color: #007ea8; }
-.user.color-28 { color: #3c8500; }
-.user.color-29 { color: #e6007e; }
-.user.color-30 { color: #c75300; }
-.user.color-31 { color: #eb0400; }
-.user.color-32 { color: #e60082; }
-
-#chat .self .content {
- color: var(--body-color-muted);
+#chat .user:hover {
+ opacity: .6;
}
-#chat .msg.channel_list_loading .text {
+#chat.colored-nicks .user.color-1 { color: #1396cf; }
+#chat.colored-nicks .user.color-2 { color: #ffcf89; }
+#chat.colored-nicks .user.color-3 { color: #00dc5f; }
+#chat.colored-nicks .user.color-4 { color: #ff5bc8; }
+#chat.colored-nicks .user.color-5 { color: #ff0e1b; }
+#chat.colored-nicks .user.color-6 { color: #000094; }
+#chat.colored-nicks .user.color-7 { color: #006441; }
+#chat.colored-nicks .user.color-8 { color: #00566e; }
+#chat.colored-nicks .user.color-9 { color: #ff0078; }
+#chat.colored-nicks .user.color-10 { color: #15d5a3; }
+#chat.colored-nicks .user.color-11 { color: #006b3b; }
+#chat.colored-nicks .user.color-12 { color: #00c5ba; }
+#chat.colored-nicks .user.color-13 { color: #00465b; }
+#chat.colored-nicks .user.color-14 { color: #ffafce; }
+#chat.colored-nicks .user.color-15 { color: #ff3b12; }
+#chat.colored-nicks .user.color-16 { color: #16cc6a; }
+#chat.colored-nicks .user.color-17 { color: #ff0072; }
+#chat.colored-nicks .user.color-18 { color: #ff5877; }
+#chat.colored-nicks .user.color-19 { color: #ff1753; }
+#chat.colored-nicks .user.color-20 { color: #007a56; }
+#chat.colored-nicks .user.color-21 { color: #095092; }
+#chat.colored-nicks .user.color-22 { color: #000bde; }
+#chat.colored-nicks .user.color-23 { color: #00bca9; }
+#chat.colored-nicks .user.color-24 { color: #00367d; }
+#chat.colored-nicks .user.color-25 { color: #009ec4; }
+#chat.colored-nicks .user.color-26 { color: #006119; }
+#chat.colored-nicks .user.color-27 { color: #008bb8; }
+#chat.colored-nicks .user.color-28 { color: #469c00; }
+#chat.colored-nicks .user.color-29 { color: #ff0f95; }
+#chat.colored-nicks .user.color-30 { color: #ff7615; }
+#chat.colored-nicks .user.color-31 { color: #ff4846; }
+#chat.colored-nicks .user.color-32 { color: #ff199b; }
+
+#chat .text {
+ padding-left: 10px;
+ padding-right: 6px;
+}
+
+#chat .self .text {
color: #999;
- font-style: italic;
- padding-left: 20px;
}
-#chat .msg.channel_list_truncated .text {
- color: #f00;
- padding-left: 20px;
+#chat .msg.motd .text,
+#chat .msg.message .text,
+#chat .msg.action .action-text,
+#chat .msg.notice .text {
+ white-space: pre-wrap;
+ overflow: hidden;
}
-#chat table.channel-list,
-#chat table.ban-list,
-#chat table.invite-list,
-#chat table.ignore-list {
- margin: 5px 10px;
- width: calc(100% - 30px);
-}
-
-#chat table.channel-list th,
-#chat table.ban-list th,
-#chat table.invite-list th,
-#chat table.ignore-list th,
-#chat table.channel-list td,
-#chat table.ban-list td,
-#chat table.invite-list td {
- padding: 5px;
- vertical-align: top;
- border-bottom: #eee 1px solid;
-}
-
-#chat table.channel-list .channel {
- width: 80px;
-}
-
-#chat table.channel-list .channel,
-#chat table.channel-list .topic,
-#chat table.ban-list .hostmask,
-#chat table.ban-list .banned_by,
-#chat table.ban-list .banned_at,
-#chat table.ignore-list .hostmask,
-#chat table.ignore-list .when {
- text-align: left;
-}
-
-#chat table.channel-list .users {
- text-align: center;
- width: 50px;
-}
-
-#chat.hide-motd .msg[data-command="motd"] {
+#chat.hide-join .join,
+#chat.hide-mode .mode,
+#chat.hide-motd .motd,
+#chat.hide-nick .nick,
+#chat.hide-part .part,
+#chat.hide-quit .quit {
display: none !important;
}
-#chat .msg[data-type="monospace_block"] .text {
- background: #f6f6f6;
- display: inline-block;
- border-radius: 4px;
- padding: 6px;
+#chat .join .text,
+#chat .kick .text,
+#chat .mode .text,
+#chat .nick .text,
+#chat .part .text,
+#chat .quit .text,
+#chat .topic .text,
+#chat .topic_set_by .text {
+ color: #999;
}
-#chat .msg[data-type="condensed"] .content,
-#chat .msg[data-type="away"] .content,
-#chat .msg[data-type="back"] .content,
-#chat .msg[data-type="join"] .content,
-#chat .msg[data-type="kick"] .content,
-#chat .msg[data-type="mode"] .content,
-#chat .msg[data-type="nick"] .content,
-#chat .msg[data-type="chghost"] .content,
-#chat .msg[data-type="part"] .content,
-#chat .msg[data-type="quit"] .content,
-#chat .msg[data-type="topic"] .content,
-#chat .msg[data-type="topic_set_by"] .content {
- color: var(--body-color-muted);
-}
-
-#chat .msg[data-type="action"] .from,
-#chat .msg[data-type="action"] .content,
-#chat .msg[data-type="action"] .user {
+#chat .action .from,
+#chat .action .text,
+#chat .action .user {
color: #f39c12;
}
-#chat .msg[data-type="notice"] .time,
-#chat .msg[data-type="wallops"] .time,
-#chat .msg[data-type="notice"] .content,
-#chat .msg[data-type="wallops"] .content,
-#chat .msg[data-type="notice"] .user,
-#chat .msg[data-type="wallops"] .user {
- color: #0074d9;
+#chat .notice .time,
+#chat .notice .text,
+#chat .chan .notice .user {
+ color: #0074d9 !important;
}
-#chat .msg[data-type="notice"] .from .user::before {
+#chat .notice .user:before {
content: "Notice: ";
}
-#chat .msg[data-type="wallops"] .from .user::before {
- content: "Wallops: ";
+#chat .error,
+#chat .error .from,
+#chat .channel .highlight .from,
+#chat .channel .highlight .text,
+#chat .channel .highlight .user {
+ color: #f00;
}
-#chat .msg[data-type="error"],
-#chat .msg[data-type="error"] .from {
- color: #e74c3c;
+#chat .unhandled .from {
+ color: #eee;
}
-#chat .chat-view[data-type="channel"] .msg.highlight {
- background-color: var(--highlight-bg-color);
- border-left: 5px solid var(--highlight-border-color);
+#chat .msg.toggle .time {
+ visibility: hidden;
}
-#chat .chat-view[data-type="channel"] .msg.highlight .time {
- padding-left: 5px;
- color: #696969;
-}
-
-#chat .chat-view[data-type="channel"] .msg.highlight .content {
- border-left: 1px solid var(--highlight-bg-color);
-}
-
-#chat .preview-size {
- margin-left: 5px;
- user-select: none;
-}
-
-#chat .toggle-content.opened .more-caret, /* Expand/Collapse link previews */
-#chat .toggle-button.opened, /* Thumbnail toggle */
-#chat .msg:not(.closed)[data-type="condensed"] .toggle-button { /* Expanded status message toggle */
- transform: rotate(90deg);
-}
-
-#chat .preview {
- display: flex; /* Fix odd margin added by inline-flex in .toggle-content */
+#chat .toggle-button {
+ background: #f5f5f5;
+ border-radius: 2px;
+ display: inline-block;
+ color: #666;
+ height: 1em;
+ line-height: 0;
+ padding: 0 6px;
}
#chat .toggle-content {
- background: #f6f6f6;
- border-radius: 5px;
+ background: #f5f5f5;
+ border-radius: 2px;
+ display: none;
+ color: #222;
+ font: 12px Lato;
max-width: 100%;
- margin: 0;
- margin-top: 6px;
- overflow: hidden;
- box-shadow: 0 1px 3px rgb(0 0 0 / 20%);
- display: inline-flex !important;
- align-items: flex-start;
- white-space: normal;
+ padding: 6px 8px;
+ margin-top: 2px;
+}
+
+#chat .toggle-content a {
+ color: inherit;
}
-/* This applies to images of preview-type-image and thumbnails of preview-type-link */
#chat .toggle-content img {
max-width: 100%;
- max-height: 128px;
+ max-height: 250px;
display: block;
- cursor: zoom-in;
+ margin: 2px 0;
}
-#chat .toggle-content pre.prefetch-error {
- padding: 0;
- margin: 0;
- color: inherit;
- background-color: transparent;
-}
-
-#chat .toggle-content .prefetch-error {
- display: none;
-}
-
-#chat .toggle-content.opened .prefetch-error {
- display: inline;
-}
-
-/* This applies to thumbnails of preview-type-link only */
#chat .toggle-content .thumb {
- max-height: 54px;
- max-width: 96px;
-}
-
-#chat .toggle-type-error,
-#chat .toggle-content .toggle-text {
- padding: 8px 10px;
-}
-
-#chat .toggle-content .toggle-text {
- white-space: nowrap;
- overflow: hidden;
- text-align: initial;
-}
-
-#chat .toggle-content.opened .toggle-text {
- white-space: normal;
+ max-height: 110px;
+ max-width: 210px;
}
#chat .toggle-content .head {
- display: flex;
- align-items: flex-start;
font-weight: bold;
}
-#chat .toggle-type-error,
-#chat .toggle-text .body {
- color: #717171;
+#chat .toggle-content .body {
+ color: #999;
+ max-width: 460px;
+ word-break: normal;
+ word-wrap: break-word;
}
-#chat .toggle-text a {
- color: inherit;
+#chat .toggle-content.show {
+ display: inline-block !important;
}
-#chat .toggle-text .overflowable {
- text-overflow: ellipsis;
- overflow: hidden;
- flex-grow: 1;
-}
-
-#chat .toggle-content .more {
- color: var(--link-color);
- font-weight: normal;
- margin-left: 10px;
- flex-shrink: 0;
-}
-
-#chat .toggle-content .more:hover {
- text-decoration: underline;
-}
-
-#chat .toggle-content .more::after {
- content: " " attr(aria-label);
-}
-
-#chat .toggle-content .more-caret {
- display: inline-block;
- transition: transform 0.2s;
-}
-
-#chat .toggle-content .more-caret::before {
- content: "\f0da"; /* https://fontawesome.com/icons/caret-right?style=solid */
-}
-
-#chat audio {
- width: 600px;
- max-width: 100%;
-}
-
-#chat .toggle-type-video {
- max-width: 640px;
-}
-
-#chat video {
- max-width: 100%;
- max-height: 240px;
-}
-
-/* Do not display an empty div when there are no previews. Useful for example in
-part/quit messages where we don't load previews (adds a blank line otherwise) */
-#chat .preview:empty {
- display: none;
-}
-
-#chat .userlist .count {
+#chat .count {
background: #fafafa;
- height: 45px;
- flex-shrink: 0;
- position: relative;
+ height: 48px;
+ left: 0;
+ position: absolute;
+ right: 0;
+ top: 0;
}
-#chat .userlist .search {
- color: var(--body-color);
- appearance: none;
+#chat .search {
+ color: #222;
border: 0;
background: none;
font: inherit;
outline: 0;
- padding: 13px;
- padding-right: 30px;
+ padding: 18px 16px;
+ position: relative;
width: 100%;
}
-#chat .userlist .names {
- flex-grow: 1;
+#chat .names {
+ bottom: 0;
overflow: auto;
overflow-x: hidden;
- padding-bottom: 10px;
- width: 100%;
- touch-action: pan-y;
- scrollbar-width: thin;
- overscroll-behavior: contain;
-webkit-overflow-scrolling: touch;
+ padding-bottom: 10px;
+ position: absolute;
+ top: 48px;
+ width: 100%;
}
#chat .names .user {
display: block;
line-height: 1.6;
padding: 0 16px;
- white-space: nowrap;
}
-#chat .user-mode {
- margin-bottom: 15px;
-}
-
-#chat .user-mode::before {
- background: var(--window-bg-color);
- color: var(--body-color-muted);
+#chat .user-mode:before {
+ content: "";
+ border-bottom: 1px solid #eee;
display: block;
- font-size: 0.85em;
line-height: 1.6;
- padding: 5px 16px;
- position: sticky;
- top: 0;
+ padding: 12px 16px 10px;
+ margin-bottom: 10px;
}
-#chat .user-mode.owner::before {
+#chat .user-mode.owner:before {
content: "Owners";
}
-#chat .user-mode.admin::before {
+#chat .user-mode.admin:before {
content: "Administrators";
}
-#chat .user-mode.op::before {
+#chat .user-mode.op:before {
content: "Operators";
}
-#chat .user-mode.half-op::before {
+#chat .user-mode.half-op:before {
content: "Half-Operators";
}
-#chat .user-mode.voice::before {
+#chat .user-mode.voice:before {
content: "Voiced";
}
-#chat .user-mode.normal::before {
+#chat .user-mode.normal:before {
content: "Users";
}
-#chat .user-mode-search::before {
- content: "Search Results";
-}
-
#loading {
- display: flex;
font-size: 14px;
- height: 100%;
-}
-
-#loading .window {
- height: initial;
- display: flex;
- flex-direction: column;
+ z-index: 1;
}
#loading p {
margin-top: 10px;
}
-#loading-slow,
-#loading-reload {
- visibility: hidden;
-}
-
-#loading summary {
- outline: none;
- cursor: pointer;
-}
-
-#loading pre {
- text-align: left;
- white-space: normal;
-}
-
-#sign-in .container,
-#loading-reload-container,
-#loading-status-container {
- flex: 1 0 auto;
- display: flex;
- align-items: center;
- justify-content: center;
- flex-direction: column;
-}
-
-#loading-reload-container {
- flex-grow: 0;
-}
-
-#loading .logo-inverted,
-.window .logo-inverted {
- display: none; /* In dark themes, inverted logo must be used instead */
+#loading-slow {
+ display: none;
}
#sign-in label {
display: block;
margin-top: 10px;
- width: 100%;
+}
+
+#sign-in .remember {
+ float: left;
+ font-size: 14px;
+ margin-top: 12px;
+}
+
+#sign-in .remember input {
+ float: left;
+ margin: 3px 10px 0 0;
}
#sign-in .btn {
@@ -1880,112 +1152,67 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */
#sign-in .error {
color: #e74c3c;
margin-top: 1em;
- width: 100%;
-}
-
-#connect .connect-row {
- display: flex;
-}
-
-#connect .connect-row > .input,
-#connect .connect-row > .input-wrap {
- flex-grow: 1;
}
#connect label {
- width: 25%;
- flex-shrink: 0;
+ display: block;
margin-top: 11px;
}
+#connect .port:before {
+ content: ":";
+ margin: 9px 0 0 -17px;
+ position: absolute;
+}
+
#connect .tls {
- width: 100%;
- display: block;
+ float: left;
+ font-size: 14px;
margin-top: 6px;
}
-#connect .tls input,
-#connect input[name="proxyEnabled"] {
+#connect .tls input {
+ float: left;
margin: 3px 10px 0 0;
}
-#connect\:host,
-#connect\:proxyHost {
- width: 70%;
-}
-
-#connect\:port,
-#connect\:proxyPort {
- width: 25%;
-}
-
-#connect\:portseparator,
-#connect\:proxyPortSeparator {
- width: 5%;
- text-align: center;
- display: inline-block;
-}
-
#connect .btn {
- margin-top: 15px;
- width: 100%;
-}
-
-#settings .settings-sync-panel {
- padding: 10px;
- margin-bottom: 16px;
- border-radius: 2px;
- background-color: #d9edf7;
- color: #31708f;
-}
-
-#settings .settings-sync-panel p:last-child {
- margin-bottom: 0;
-}
-
-#settings .settings-sync-panel .btn {
- color: #007bff;
- border-color: #007bff;
- margin-bottom: 0;
-}
-
-#settings .settings-sync-panel .btn:hover,
-#settings .settings-sync-panel .btn:focus {
- background-color: #007bff;
- color: #fff;
-}
-
-#settings .settings-sync-panel .btn:active,
-#settings .settings-sync-panel .btn:focus {
- box-shadow: 0 0 0 3px rgb(0 123 255 / 50%);
+ float: left;
+ margin-top: 30px;
}
#settings .opt {
display: block;
- padding: 5px 0 5px 1px;
+ padding: 5px 0 10px 1px;
}
#settings .opt input {
- margin-right: 6px;
+ float: left;
+ margin: 4px 10px 0 0;
}
-#connect .extra-help,
-#settings .extra-help {
- cursor: help;
+#settings .about,
+#settings #play {
+ color: #7f8c8d;
}
-#settings h2 .extra-help {
- font-size: 0.8em;
+#settings .about small {
+ margin-left: 2px;
}
#settings #play {
font-size: 14px;
- transition: opacity 0.2s;
- color: var(--window-heading-color);
+ transition: opacity .2s;
}
#settings #play:hover {
- opacity: 0.8;
+ opacity: .8;
+}
+
+#settings .about {
+ font-size: 14px;
+ padding-top: 2px;
+ line-height: 1.8;
}
#settings #change-password .error,
@@ -2003,282 +1230,83 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */
#settings .error {
color: #e74c3c;
- margin-top: 0.2em;
-}
-
-.password-container {
- position: relative;
-}
-
-.password-container input {
- padding-right: 37px;
-}
-
-#sign-in .password-container {
- width: 100%;
-}
-
-#sign-in .password-container .reveal-password {
- top: 31px;
-}
-
-.password-container .reveal-password {
- position: absolute;
- top: 2px;
- right: 0;
- appearance: none;
-}
-
-.password-container .reveal-password span {
- font-size: 16px;
- color: #607992;
- width: 35px;
- height: 35px;
- display: flex;
- justify-content: center;
- align-items: center;
- cursor: pointer;
-}
-
-.password-container .reveal-password span::before {
- content: "\f06e"; /* https://fontawesome.com/icons/eye?style=solid */
-}
-
-.topic-container .save-topic span::before {
- content: "\f00c"; /* https://fontawesome.com/icons/check?style=solid */
-}
-
-.password-container .reveal-password-visible span::before {
- content: "\f070"; /* https://fontawesome.com/icons/eye-slash?style=solid */
- color: #ff4136;
-}
-
-#help .help-version-title {
- display: flex;
- justify-content: space-between;
-}
-
-#help .help-item {
- display: table-row;
- font-size: 14px;
-}
-
-#help .help-item .subject,
-#help .help-item .description {
- display: table-cell;
- padding-bottom: 15px;
-}
-
-#help .help-item .subject {
- white-space: nowrap;
- padding-right: 15px;
-}
-
-#help .help-item .subject.gesture {
- font-weight: bold;
-}
-
-#help .help-item .description p {
- margin-bottom: 0;
-}
-
-.whois {
- display: grid;
- grid-template-columns: max-content auto;
- margin: 0;
-}
-
-.whois dt {
- grid-column-start: 1;
- margin-right: 20px;
-}
-
-.whois dd {
- grid-column-start: 2;
-}
-
-.changelog-text {
- line-height: 1.5;
-}
-
-.changelog-text p {
- margin-bottom: 16px;
-}
-
-.window#changelog h3 {
- font-size: 20px;
- border-bottom: 1px solid currentcolor;
- color: var(--window-heading-color);
- margin: 30px 0 10px;
- padding-bottom: 7px;
-}
-
-.window#chat-container {
- /*
- Chat has its own scrollbar, so remove the one on parent
- This caused a performance issue in Chrome
- */
- overflow: hidden;
-}
-
-#version-checker {
- display: flex;
- align-items: center;
- padding: 10px;
- margin-bottom: 16px;
- border-radius: 2px;
- transition: color 0.2s, background-color 0.2s;
-}
-
-#version-checker p,
-#version-checker button {
- margin-bottom: 0;
-}
-
-#version-checker p {
- flex: 1;
- padding-top: 6px;
- padding-bottom: 6px;
-}
-
-#version-checker::before {
- margin-left: 6px;
- margin-right: 12px;
- font-size: 1.2em;
-}
-
-#version-checker.loading {
- background-color: #d9edf7;
- color: #31708f;
-}
-
-#version-checker.loading::before {
- content: "\f253"; /* https://fontawesome.com/icons/hourglass-end?style=solid */
-}
-
-#version-checker.new-version,
-#version-checker.new-packages {
- color: #8a6d3b;
- background-color: #fcf8e3;
-}
-
-#version-checker.new-version::before,
-#version-checker.new-packages::before {
- content: "\f164"; /* https://fontawesome.com/icons/thumbs-up?style=solid */
-}
-
-#version-checker.error {
- color: #a94442;
- background-color: #f2dede;
-}
-
-#version-checker.error::before {
- content: "\f06a"; /* http://fontawesome.io/icon/exclamation-circle/ */
-}
-
-#version-checker.up-to-date {
- background-color: #dff0d8;
- color: #3c763d;
-}
-
-#version-checker.up-to-date::before {
- content: "\f00c"; /* http://fontawesome.io/icon/check/ */
-}
-
-#upload-progressbar {
- background: var(--upload-progressbar-color);
- box-shadow: 0 0 10px var(--upload-progressbar-color);
- width: 0%;
- height: 2px;
- visibility: hidden;
- position: absolute;
- top: -1px; /* put it on top of #form's border */
- left: 0;
-}
-
-#upload-progressbar.upload-progressbar-visible {
- visibility: visible;
- transition: 0.3s width ease-in-out;
+ margin-top: .2em;
}
#form {
+ background: #eee;
+ border-top: 1px solid #ddd;
flex: 0 0 auto;
- border: 0;
- border-top: 1px solid #e7e7e7;
- border-radius: 0;
+ padding: 5px;
+}
+
+#windows #form .input {
+ font: 12px Consolas, Menlo, Monaco, "Lucida Console", "DejaVu Sans Mono", "Courier New", monospace;
+ border: 1px solid #ddd;
+ border-radius: 2px;
margin: 0;
- padding: 6px;
+ padding: 0;
background: white;
display: flex;
align-items: flex-end;
- position: relative;
-}
-
-#user-visible-error {
- font-size: 14px;
- line-height: 1.5;
- font-weight: 600;
- padding: 10px;
- word-spacing: 3px;
- text-transform: uppercase;
- background: #e74c3c;
- color: #fff;
- text-align: center;
- cursor: pointer;
}
#form #nick {
background: #f6f6f6;
color: #666;
- font-size: 13px;
+ font: inherit;
+ font-size: 11px;
margin: 4px;
- line-height: 24px;
- padding: 0 8px;
- border-radius: 2px;
- display: none;
+ line-height: 26px;
+ height: 24px;
+ padding: 0 9px;
+ border-radius: 1px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ flex: 0 0 auto;
}
-.public #form #nick {
- display: block;
+#form #nick:empty {
+ visibility: hidden;
+}
+
+#form #nick:after {
+ content: ":";
}
#form #input {
background: transparent;
border: none;
font: inherit;
- min-height: 19px; /* Required when computing input height at char deletion */
- height: 19px;
- max-height: 95px; /* min-height/height x number of lines maximum */
- line-height: 19px; /* should match height */
+ min-height: 18px; /* Required when computing input height at char deletion */
+ height: 18px;
+ max-height: 90px;
+ line-height: 1.5;
outline: none;
margin: 5px;
padding: 0;
resize: none;
flex: 1 0 auto;
align-self: center;
- touch-action: pan-y;
}
-#form #upload-input {
- display: none;
-}
-
-#form #upload,
#form #submit {
- color: #607992;
+ color: #9ca5b4;
font-size: 14px;
height: 32px;
+ transition: opacity .2s;
width: 32px;
flex: 0 0 auto;
}
-#form #upload[disabled],
-#form #submit[disabled] {
- opacity: 0.5;
+#form #submit:hover {
+ opacity: .6;
}
-#mentions-popup-container,
#context-menu-container {
+ display: none;
position: absolute;
top: 0;
left: 0;
@@ -2288,290 +1316,267 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */
background: transparent;
}
-#context-menu-container.passthrough {
- pointer-events: none;
-}
-
-#context-menu-container.passthrough > * {
- pointer-events: auto;
-}
-
-.mentions-popup,
-#context-menu,
-.textcomplete-menu {
+#context-menu {
position: absolute;
list-style: none;
margin: 0;
- padding: 0 6px;
- min-width: 180px;
+ padding: 0;
+ min-width: 160px;
font-size: 14px;
background-color: #fff;
- box-shadow: 0 3px 12px rgb(0 0 0 / 15%);
- border: 1px solid rgb(0 0 0 / 15%);
- border-radius: 5px;
- outline: 0;
+ box-shadow: 0 3px 12px rgba(0, 0, 0, .15);
+ border: 1px solid rgba(0, 0, 0, .15);
+ border-radius: 2px;
}
.context-menu-divider {
height: 1px;
margin: 6px 0;
- background-color: rgb(0 0 0 / 10%);
+ background-color: rgba(0, 0, 0, .1);
}
-.context-menu-item,
-.textcomplete-item {
+.context-menu-item {
cursor: pointer;
display: block;
padding: 4px 8px;
color: #333;
margin-top: 6px;
margin-bottom: 6px;
- line-height: 1.4;
- border-radius: 3px;
- white-space: nowrap;
}
-.context-menu-item.active,
-.textcomplete-item:focus,
-.textcomplete-item:hover,
-.textcomplete-menu .active,
-#chat .userlist .user.active {
- background-color: rgb(0 0 0 / 10%);
+.context-menu-item:hover {
+ background-color: #f6f6f6;
}
-.context-menu-item::before,
-.textcomplete-item::before {
+.context-menu-item:before {
width: 20px;
display: inline-block;
}
-.textcomplete-item a {
- color: #333;
+/**
+ * Tooltips
+ * See http://primercss.io/tooltips/
+ */
+.tooltipped {
+ position: relative;
}
-.textcomplete-item a:hover {
+.tooltipped:after {
+ position: absolute;
+ z-index: 1000000;
+ display: inline-block;
+ visibility: hidden;
+ opacity: 0;
+ padding: 5px 8px;
+ font-size: 12px;
+ line-height: 1.2;
+ color: #262c36;
+ text-align: center;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-wrap: break-word;
+ white-space: pre;
+ pointer-events: none;
+ content: attr(aria-label);
+ background: #fff;
+ border-radius: 3px;
+ -webkit-font-smoothing: subpixel-antialiased;
+ transition: .2s;
+}
+
+.tooltipped:before {
+ position: absolute;
+ z-index: 1000001;
+ display: inline-block;
+ visibility: hidden;
+ opacity: 0;
+ width: 0;
+ height: 0;
+ color: #262c36;
+ pointer-events: none;
+ content: "";
+ border: 5px solid transparent;
+ transition: .2s;
+}
+
+.tooltipped:hover:before,
+.tooltipped:hover:after,
+.tooltipped:active:before,
+.tooltipped:active:after,
+.tooltipped:focus:before,
+.tooltipped:focus:after {
+ visibility: visible;
+ opacity: 1;
text-decoration: none;
}
-.emoji {
- font-size: 1.4em;
- vertical-align: text-top;
- line-height: 1;
+.tooltipped-s:after,
+.tooltipped-se:after,
+.tooltipped-sw:after {
+ top: 100%;
+ right: 50%;
+ margin-top: 5px;
}
-.textcomplete-item .emoji {
- width: 32px;
- text-align: center;
+.tooltipped-s:before,
+.tooltipped-se:before,
+.tooltipped-sw:before {
+ top: auto;
+ right: 50%;
+ bottom: -5px;
+ margin-right: -5px;
+ border-bottom-color: #fff;
}
-.textcomplete-item .irc-bg {
- display: block;
+.tooltipped-se:after {
+ right: auto;
+ left: 50%;
+ margin-left: -15px;
+}
+
+.tooltipped-sw:after {
+ margin-right: -15px;
+}
+
+.tooltipped-n:after,
+.tooltipped-ne:after,
+.tooltipped-nw:after {
+ right: 50%;
+ bottom: 100%;
+ margin-bottom: 5px;
+}
+
+.tooltipped-n:before,
+.tooltipped-ne:before,
+.tooltipped-nw:before {
+ top: -5px;
+ right: 50%;
+ bottom: auto;
+ margin-right: -5px;
+ border-top-color: #fff;
+}
+
+.tooltipped-ne:after {
+ right: auto;
+ left: 50%;
+ margin-left: -15px;
+}
+
+.tooltipped-nw:after {
+ margin-right: -15px;
+}
+
+.tooltipped-s:after,
+.tooltipped-n:after {
+ -webkit-transform: translateX(50%);
+ -ms-transform: translateX(50%);
+ transform: translateX(50%);
+}
+
+.tooltipped-w:after {
+ right: 100%;
+ bottom: 50%;
+ margin-right: 5px;
+ -webkit-transform: translateY(50%);
+ -ms-transform: translateY(50%);
+ transform: translateY(50%);
+}
+
+.tooltipped-w:before {
+ top: 50%;
+ bottom: 50%;
+ left: -5px;
+ margin-top: -5px;
+ border-left-color: #fff;
+}
+
+.tooltipped-e:after {
+ bottom: 50%;
+ left: 100%;
+ margin-left: 5px;
+ -webkit-transform: translateY(50%);
+ -ms-transform: translateY(50%);
+ transform: translateY(50%);
+}
+
+.tooltipped-e:before {
+ top: 50%;
+ right: -5px;
+ bottom: 50%;
+ margin-top: -5px;
+ border-right-color: #fff;
}
/**
* IRC Message Styling
+ * https://github.com/megawac/irc-style-parser
* Colours are credit to http://clrs.cc/
*/
.irc-fg0 { color: #fff; }
-.irc-fg1 { color: #000; }
-.irc-fg2 { color: #001f3f; }
-.irc-fg3 { color: #2ecc40; }
-.irc-fg4 { color: #ff4136; }
-.irc-fg5 { color: #85144b; }
-.irc-fg6 { color: #b10dc9; }
-.irc-fg7 { color: #ff851b; }
-.irc-fg8 { color: #ffdc00; }
-.irc-fg9 { color: #01ff70; }
-.irc-fg10 { color: #39cccc; }
-.irc-fg11 { color: #7fdbff; }
-.irc-fg12 { color: #0074d9; }
-.irc-fg13 { color: #f012be; }
-.irc-fg14 { color: #aaa; }
-.irc-fg15 { color: #ddd; }
-.irc-bg0 { background: #fff; }
-.irc-bg1 { background: #000; }
-.irc-bg2 { background: #001f3f; }
-.irc-bg3 { background: #2ecc40; }
-.irc-bg4 { background: #ff4136; }
-.irc-bg5 { background: #85144b; }
-.irc-bg6 { background: #b10dc9; }
-.irc-bg7 { background: #ff851b; }
-.irc-bg8 { background: #ffdc00; }
-.irc-bg9 { background: #01ff70; }
-.irc-bg10 { background: #39cccc; }
-.irc-bg11 { background: #7fdbff; }
-.irc-bg12 { background: #0074d9; }
-.irc-bg13 { background: #f012be; }
-.irc-bg14 { background: #aaa; }
-.irc-bg15 { background: #ddd; }
-/* https://modern.ircdocs.horse/formatting.html#colors-16-98 */
-.irc-fg16 { color: #470000; }
-.irc-fg17 { color: #472100; }
-.irc-fg18 { color: #474700; }
-.irc-fg19 { color: #324700; }
-.irc-fg20 { color: #004700; }
-.irc-fg21 { color: #00472c; }
-.irc-fg22 { color: #004747; }
-.irc-fg23 { color: #002747; }
-.irc-fg24 { color: #000047; }
-.irc-fg25 { color: #2e0047; }
-.irc-fg26 { color: #470047; }
-.irc-fg27 { color: #47002a; }
-.irc-fg28 { color: #740000; }
-.irc-fg29 { color: #743a00; }
-.irc-fg30 { color: #747400; }
-.irc-fg31 { color: #517400; }
-.irc-fg32 { color: #007400; }
-.irc-fg33 { color: #007449; }
-.irc-fg34 { color: #007474; }
-.irc-fg35 { color: #004074; }
-.irc-fg36 { color: #000074; }
-.irc-fg37 { color: #4b0074; }
-.irc-fg38 { color: #740074; }
-.irc-fg39 { color: #740045; }
-.irc-fg40 { color: #b50000; }
-.irc-fg41 { color: #b56300; }
-.irc-fg42 { color: #b5b500; }
-.irc-fg43 { color: #7db500; }
-.irc-fg44 { color: #00b500; }
-.irc-fg45 { color: #00b571; }
-.irc-fg46 { color: #00b5b5; }
-.irc-fg47 { color: #0063b5; }
-.irc-fg48 { color: #0000b5; }
-.irc-fg49 { color: #7500b5; }
-.irc-fg50 { color: #b500b5; }
-.irc-fg51 { color: #b5006b; }
-.irc-fg52 { color: #f00; }
-.irc-fg53 { color: #ff8c00; }
-.irc-fg54 { color: #ff0; }
-.irc-fg55 { color: #b2ff00; }
-.irc-fg56 { color: #0f0; }
-.irc-fg57 { color: #00ffa0; }
-.irc-fg58 { color: #0ff; }
-.irc-fg59 { color: #008cff; }
-.irc-fg60 { color: #00f; }
-.irc-fg61 { color: #a500ff; }
-.irc-fg62 { color: #f0f; }
-.irc-fg63 { color: #ff0098; }
-.irc-fg64 { color: #ff5959; }
-.irc-fg65 { color: #ffb459; }
-.irc-fg66 { color: #ffff71; }
-.irc-fg67 { color: #cfff60; }
-.irc-fg68 { color: #6fff6f; }
-.irc-fg69 { color: #65ffc9; }
-.irc-fg70 { color: #6dffff; }
-.irc-fg71 { color: #59b4ff; }
-.irc-fg72 { color: #5959ff; }
-.irc-fg73 { color: #c459ff; }
-.irc-fg74 { color: #f6f; }
-.irc-fg75 { color: #ff59bc; }
-.irc-fg76 { color: #ff9c9c; }
-.irc-fg77 { color: #ffd39c; }
-.irc-fg78 { color: #ffff9c; }
-.irc-fg79 { color: #e2ff9c; }
-.irc-fg80 { color: #9cff9c; }
-.irc-fg81 { color: #9cffdb; }
-.irc-fg82 { color: #9cffff; }
-.irc-fg83 { color: #9cd3ff; }
-.irc-fg84 { color: #9c9cff; }
-.irc-fg85 { color: #dc9cff; }
-.irc-fg86 { color: #ff9cff; }
-.irc-fg87 { color: #ff94d3; }
-.irc-fg88 { color: #000; }
-.irc-fg89 { color: #131313; }
-.irc-fg90 { color: #282828; }
-.irc-fg91 { color: #363636; }
-.irc-fg92 { color: #4d4d4d; }
-.irc-fg93 { color: #656565; }
-.irc-fg94 { color: #818181; }
-.irc-fg95 { color: #9f9f9f; }
-.irc-fg96 { color: #bcbcbc; }
-.irc-fg97 { color: #e2e2e2; }
-.irc-fg98 { color: #fff; }
-.irc-bg16 { background-color: #470000; }
-.irc-bg17 { background-color: #472100; }
-.irc-bg18 { background-color: #474700; }
-.irc-bg19 { background-color: #324700; }
-.irc-bg20 { background-color: #004700; }
-.irc-bg21 { background-color: #00472c; }
-.irc-bg22 { background-color: #004747; }
-.irc-bg23 { background-color: #002747; }
-.irc-bg24 { background-color: #000047; }
-.irc-bg25 { background-color: #2e0047; }
-.irc-bg26 { background-color: #470047; }
-.irc-bg27 { background-color: #47002a; }
-.irc-bg28 { background-color: #740000; }
-.irc-bg29 { background-color: #743a00; }
-.irc-bg30 { background-color: #747400; }
-.irc-bg31 { background-color: #517400; }
-.irc-bg32 { background-color: #007400; }
-.irc-bg33 { background-color: #007449; }
-.irc-bg34 { background-color: #007474; }
-.irc-bg35 { background-color: #004074; }
-.irc-bg36 { background-color: #000074; }
-.irc-bg37 { background-color: #4b0074; }
-.irc-bg38 { background-color: #740074; }
-.irc-bg39 { background-color: #740045; }
-.irc-bg40 { background-color: #b50000; }
-.irc-bg41 { background-color: #b56300; }
-.irc-bg42 { background-color: #b5b500; }
-.irc-bg43 { background-color: #7db500; }
-.irc-bg44 { background-color: #00b500; }
-.irc-bg45 { background-color: #00b571; }
-.irc-bg46 { background-color: #00b5b5; }
-.irc-bg47 { background-color: #0063b5; }
-.irc-bg48 { background-color: #0000b5; }
-.irc-bg49 { background-color: #7500b5; }
-.irc-bg50 { background-color: #b500b5; }
-.irc-bg51 { background-color: #b5006b; }
-.irc-bg52 { background-color: #f00; }
-.irc-bg53 { background-color: #ff8c00; }
-.irc-bg54 { background-color: #ff0; }
-.irc-bg55 { background-color: #b2ff00; }
-.irc-bg56 { background-color: #0f0; }
-.irc-bg57 { background-color: #00ffa0; }
-.irc-bg58 { background-color: #0ff; }
-.irc-bg59 { background-color: #008cff; }
-.irc-bg60 { background-color: #00f; }
-.irc-bg61 { background-color: #a500ff; }
-.irc-bg62 { background-color: #f0f; }
-.irc-bg63 { background-color: #ff0098; }
-.irc-bg64 { background-color: #ff5959; }
-.irc-bg65 { background-color: #ffb459; }
-.irc-bg66 { background-color: #ffff71; }
-.irc-bg67 { background-color: #cfff60; }
-.irc-bg68 { background-color: #6fff6f; }
-.irc-bg69 { background-color: #65ffc9; }
-.irc-bg70 { background-color: #6dffff; }
-.irc-bg71 { background-color: #59b4ff; }
-.irc-bg72 { background-color: #5959ff; }
-.irc-bg73 { background-color: #c459ff; }
-.irc-bg74 { background-color: #f6f; }
-.irc-bg75 { background-color: #ff59bc; }
-.irc-bg76 { background-color: #ff9c9c; }
-.irc-bg77 { background-color: #ffd39c; }
-.irc-bg78 { background-color: #ffff9c; }
-.irc-bg79 { background-color: #e2ff9c; }
-.irc-bg80 { background-color: #9cff9c; }
-.irc-bg81 { background-color: #9cffdb; }
-.irc-bg82 { background-color: #9cffff; }
-.irc-bg83 { background-color: #9cd3ff; }
-.irc-bg84 { background-color: #9c9cff; }
-.irc-bg85 { background-color: #dc9cff; }
-.irc-bg86 { background-color: #ff9cff; }
-.irc-bg87 { background-color: #ff94d3; }
-.irc-bg88 { background-color: #000; }
-.irc-bg89 { background-color: #131313; }
-.irc-bg90 { background-color: #282828; }
-.irc-bg91 { background-color: #363636; }
-.irc-bg92 { background-color: #4d4d4d; }
-.irc-bg93 { background-color: #656565; }
-.irc-bg94 { background-color: #818181; }
-.irc-bg95 { background-color: #9f9f9f; }
-.irc-bg96 { background-color: #bcbcbc; }
-.irc-bg97 { background-color: #e2e2e2; }
-.irc-bg98 { background-color: #fff; }
+.irc-fg1 { color: #000; }
+
+.irc-fg2 { color: #001f3f; }
+
+.irc-fg3 { color: #2ecc40; }
+
+.irc-fg4 { color: #ff4136; }
+
+.irc-fg5 { color: #85144b; }
+
+.irc-fg6 { color: #b10dc9; }
+
+.irc-fg7 { color: #ff851b; }
+
+.irc-fg8 { color: #ffdc00; }
+
+.irc-fg9 { color: #01ff70; }
+
+.irc-fg10 { color: #39cccc; }
+
+.irc-fg11 { color: #7fdbff; }
+
+.irc-fg12 { color: #0074d9; }
+
+.irc-fg13 { color: #f012be; }
+
+.irc-fg14 { color: #aaa; }
+
+.irc-fg15 { color: #ddd; }
+
+.irc-bg0 { background: #fff; }
+
+.irc-bg1 { background: #000; }
+
+.irc-bg2 { background: #001f3f; }
+
+.irc-bg3 { background: #2ecc40; }
+
+.irc-bg4 { background: #ff4136; }
+
+.irc-bg5 { background: #85144b; }
+
+.irc-bg6 { background: #b10dc9; }
+
+.irc-bg7 { background: #ff851b; }
+
+.irc-bg8 { background: #ffdc00; }
+
+.irc-bg9 { background: #01ff70; }
+
+.irc-bg10 { background: #39cccc; }
+
+.irc-bg11 { background: #7fdbff; }
+
+.irc-bg12 { background: #0074d9; }
+
+.irc-bg13 { background: #f012be; }
+
+.irc-bg14 { background: #aaa; }
+
+.irc-bg15 { background: #ddd; }
.irc-bold {
font-weight: bold;
@@ -2581,362 +1586,115 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */
text-decoration: underline;
}
-.irc-strikethrough {
- text-decoration: line-through;
-}
-
-.irc-underline.irc-strikethrough {
- text-decoration: underline line-through;
-}
-
.irc-italic {
font-style: italic;
}
-.tooltipped::after {
- font-size: 12px;
-}
-
-@media (min-width: 480px) {
- /* Fade out for long usernames */
- #chat .from {
- padding-left: 10px;
- mask-image: linear-gradient(to left, transparent, black 10px);
- }
-}
-
@media (max-width: 768px) {
- /**
- * TODO Replace this with `@media (hover: hover)` when Firefox supports it
- * See:
- * - http://stackoverflow.com/a/28058919/1935861
- * - http://caniuse.com/#feat=css-media-interaction
- * - https://www.w3.org/TR/mediaqueries-4/
- * - https://developer.mozilla.org/en-US/docs/Web/CSS/@media/hover
- */
- .tooltipped-no-touch:hover::before,
- .tooltipped-no-touch:hover::after {
- visibility: hidden;
- opacity: 0;
+ .container {
+ margin-top: 60px !important;
}
- #sidebar .logo-container {
- margin-top: 5px;
- }
-
- .channel-list-item,
- #sidebar .empty,
- .window label,
- .header .topic,
- #settings .error,
- #help .help-item,
- #loading,
- #context-menu,
- #form #input,
- .textcomplete-menu,
- .messages .msg {
- font-size: 15px;
- }
-
- #sidebar {
- display: flex;
- background: var(--body-bg-color);
- height: 100%;
- position: absolute;
- left: -220px;
- z-index: 10;
- transition: transform 160ms;
- transform: translateZ(0);
- }
-
- #sidebar-overlay {
- position: fixed;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- background: var(--overlay-bg-color);
- opacity: 0;
- visibility: hidden;
- transition: opacity 160ms, visibility 160ms;
- z-index: 9;
- }
-
- #viewport.menu-open #sidebar-overlay {
- opacity: 1;
- }
-
- #viewport.menu-open #sidebar {
+ #viewport.lt {
+ -webkit-transform: translate3d(220px, 0, 0);
transform: translate3d(220px, 0, 0);
}
- #viewport.menu-dragging #sidebar-overlay,
- #viewport.menu-dragging #sidebar {
- transition: none;
+ #viewport.rt #chat .sidebar {
+ -webkit-transform: translate3d(-180px, 0, 0);
+ transform: translate3d(-180px, 0, 0);
}
- #viewport.menu-open #sidebar,
- #viewport.menu-dragging #sidebar {
- box-shadow: 0 0 25px 0 rgb(0 0 0 / 50%);
+ #sidebar {
+ left: -220px;
}
- #viewport.menu-open #sidebar-overlay,
- #viewport.menu-dragging #sidebar-overlay {
- visibility: visible;
+ #footer {
+ left: -215px;
+ width: 215px;
}
- /* On mobile display, channel list button stays at the top */
- #viewport .lt {
- position: relative;
+ #sidebar .empty:before {
+ margin-top: 0;
}
- #chat .userlist {
- background-color: var(--window-bg-color);
- height: 100%;
- position: absolute;
+ #main {
+ left: 5px;
+ right: 5px;
+ }
+
+ #chat .chat {
right: 0;
- transform: translateX(180px);
- transition: transform 0.2s;
- z-index: 1;
}
- #viewport.userlist-open #chat .userlist {
- transform: translateX(0);
+ #viewport .lt,
+ #viewport .channel .rt {
+ display: block;
}
- #chat .header .title {
- padding-left: 6px;
+ #windows .window .header {
+ display: block;
}
- #chat .toggle-content .thumb {
- max-height: 58px;
- max-width: 104px;
+ #chat .sidebar {
+ right: -180px;
+ }
+
+ #chat .title:before {
+ display: none;
}
}
@media (max-width: 479px) {
.container {
- max-width: 100%;
- margin: 0;
+ margin: 40px 0 !important;
}
- #sign-in .btn {
- width: 100%;
+ #connect .tls {
+ margin: 20px 0;
}
- .input {
+ #windows .input {
margin-bottom: 2px;
}
- #connect .connect-row {
- flex-direction: column;
- }
-
- #connect .connect-row > .input,
- #connect .connect-row > .input-wrap {
- flex-grow: 1;
- }
-
- #help .help-version-title {
- flex-direction: column;
- }
-
#chat .messages {
display: block;
- padding: 5px 0;
+ padding: 5px 10px;
}
#chat .msg {
display: block;
- padding: 2px 10px;
- }
-
- #chat .msg[data-type="condensed"] .msg {
padding: 2px 0;
}
#chat .time,
#chat .from,
- #chat .content {
+ #chat .text {
border: 0;
display: inline;
padding: 0;
}
- #chat .from::after {
- /* Add a space because mobile view changes to block display without paddings */
- content: " ";
- white-space: pre;
- }
-
- #chat .chat-view[data-type="channel"] .msg.highlight {
- padding-left: 5px;
- }
-
- #chat .chat-view[data-type="channel"] .msg.highlight .time {
- padding-left: 0;
- }
-
- #chat .condensed-summary .time,
- #chat .condensed-summary .from {
- display: none;
- }
-
- #help .help-item .subject {
- display: inline-block;
- padding-bottom: 4px;
- }
-
- #help .help-item .description {
- display: block;
+ #chat .unread-marker {
+ margin: 0;
}
}
::-webkit-scrollbar {
width: 8px;
- background-color: rgb(0 0 0 / 0%);
+ background-color: rgba(0, 0, 0, 0);
}
::-webkit-scrollbar:hover {
- background-color: rgb(0 0 0 / 9%);
+ background-color: rgba(0, 0, 0, .09);
}
::-webkit-scrollbar-thumb:vertical {
- background: rgb(0 0 0 / 50%);
+ background: rgba(0, 0, 0, .5);
border-radius: 100px;
}
::-webkit-scrollbar-thumb:vertical:active {
- background: rgb(0 0 0 / 60%);
-}
-
-/* Image viewer and drag-and-drop overlay */
-
-#confirm-dialog-overlay,
-#upload-overlay,
-#image-viewer,
-#image-viewer .open-btn,
-#image-viewer .close-btn {
- /* Vertically and horizontally center stuff */
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
-}
-
-#confirm-dialog-overlay,
-#upload-overlay,
-#image-viewer {
- position: fixed;
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- background: var(--overlay-bg-color);
- visibility: hidden;
- opacity: 0;
- transition: opacity 0.2s, visibility 0.2s;
- z-index: 999;
- user-select: none;
-}
-
-#confirm-dialog-overlay.opened,
-#upload-overlay.is-dragover,
-#image-viewer.opened {
- visibility: visible;
- opacity: 1;
-}
-
-#confirm-dialog-overlay,
-#image-viewer {
- background: rgb(0 0 0 / 90%);
-}
-
-#image-viewer .close-btn,
-#image-viewer .open-btn,
-#image-viewer .previous-image-btn,
-#image-viewer .next-image-btn {
- position: fixed;
- top: 0;
- width: 2em;
- font-size: 36px;
- color: white;
- opacity: 0.6;
- transition: 0.2s opacity;
-}
-
-#image-viewer .close-btn {
- right: 0;
- height: 2em;
- z-index: 1002;
-}
-
-#image-viewer .close-btn::before {
- content: "×";
-}
-
-#image-viewer .open-btn {
- right: 0;
- bottom: 0;
- top: auto;
- height: 2em;
- z-index: 1002;
-}
-
-#image-viewer .previous-image-btn,
-#image-viewer .next-image-btn {
- bottom: 0;
- z-index: 1001;
-}
-
-#image-viewer .previous-image-btn {
- left: 0;
-}
-
-#image-viewer .next-image-btn {
- right: 0;
-}
-
-#image-viewer .close-btn:hover,
-#image-viewer .previous-image-btn:hover,
-#image-viewer .next-image-btn:hover {
- opacity: 1;
-}
-
-#image-viewer > img {
- cursor: grab;
- position: absolute;
- transform-origin: 50% 50%;
-
- /* Checkered background for transparent images */
- background-position: 0 0, 10px 10px;
- background-size: 20px 20px;
- background-image:
- linear-gradient(45deg, #eee 25%, rgb(0 0 0 / 0%) 25%, rgb(0 0 0 / 0%) 75%, #eee 75%, #eee 100%),
- linear-gradient(45deg, #eee 25%, #fff 25%, #fff 75%, #eee 75%, #eee 100%);
-}
-
-/* Correctly handle multiple successive whitespace characters.
- For example: user has quit ( ===> L O L <=== ) */
-#chat .msg[data-type="action"] .content,
-#chat .msg[data-type="message"] .content,
-#chat .msg[data-type="monospace_block"] .content,
-#chat .msg[data-type="notice"] .content,
-#chat .ctcp-message,
-#chat .part-reason,
-#chat .quit-reason,
-#chat .new-topic {
- white-space: pre-wrap;
-}
-
-#chat table.channel-list .topic,
-.header .topic {
- white-space: nowrap;
-}
-
-.chat-view[data-type="search-results"] .search-status {
- display: flex;
- height: 100%;
- justify-content: center;
- align-items: center;
+ background: rgba(0, 0, 0, .6);
}
diff --git a/client/favicon.ico b/client/favicon.ico
deleted file mode 100644
index 3aad467d..00000000
Binary files a/client/favicon.ico and /dev/null differ
diff --git a/client/img/apple-touch-icon-120x120.png b/client/img/apple-touch-icon-120x120.png
new file mode 100644
index 00000000..6d7bf410
Binary files /dev/null and b/client/img/apple-touch-icon-120x120.png differ
diff --git a/client/img/favicon-alerted.ico b/client/img/favicon-alerted.ico
deleted file mode 100644
index f89ab90b..00000000
Binary files a/client/img/favicon-alerted.ico and /dev/null differ
diff --git a/client/img/favicon-notification.png b/client/img/favicon-notification.png
new file mode 100644
index 00000000..1eb1e771
Binary files /dev/null and b/client/img/favicon-notification.png differ
diff --git a/client/img/favicon.png b/client/img/favicon.png
new file mode 100644
index 00000000..3dca950b
Binary files /dev/null and b/client/img/favicon.png differ
diff --git a/client/img/icon-alerted-black-transparent-bg-72x72px.png b/client/img/icon-alerted-black-transparent-bg-72x72px.png
deleted file mode 100644
index ef63b40d..00000000
Binary files a/client/img/icon-alerted-black-transparent-bg-72x72px.png and /dev/null differ
diff --git a/client/img/icon-alerted-grey-bg-192x192px.png b/client/img/icon-alerted-grey-bg-192x192px.png
deleted file mode 100644
index 2b0586cb..00000000
Binary files a/client/img/icon-alerted-grey-bg-192x192px.png and /dev/null differ
diff --git a/client/img/icon-black-transparent-bg.svg b/client/img/icon-black-transparent-bg.svg
deleted file mode 100644
index 37e9c7d4..00000000
--- a/client/img/icon-black-transparent-bg.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/client/img/logo-64.png b/client/img/logo-64.png
new file mode 100644
index 00000000..f7dd344f
Binary files /dev/null and b/client/img/logo-64.png differ
diff --git a/client/img/logo-dark.svg b/client/img/logo-dark.svg
new file mode 100644
index 00000000..dd0d3016
--- /dev/null
+++ b/client/img/logo-dark.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/client/img/logo-grey-bg-120x120px.png b/client/img/logo-grey-bg-120x120px.png
deleted file mode 100644
index bd8ae4a1..00000000
Binary files a/client/img/logo-grey-bg-120x120px.png and /dev/null differ
diff --git a/client/img/logo-grey-bg-152x152px.png b/client/img/logo-grey-bg-152x152px.png
deleted file mode 100644
index 06cc5cc1..00000000
Binary files a/client/img/logo-grey-bg-152x152px.png and /dev/null differ
diff --git a/client/img/logo-grey-bg-167x167px.png b/client/img/logo-grey-bg-167x167px.png
deleted file mode 100644
index 0dbf4092..00000000
Binary files a/client/img/logo-grey-bg-167x167px.png and /dev/null differ
diff --git a/client/img/logo-grey-bg-180x180px.png b/client/img/logo-grey-bg-180x180px.png
deleted file mode 100644
index 33c8b5aa..00000000
Binary files a/client/img/logo-grey-bg-180x180px.png and /dev/null differ
diff --git a/client/img/logo-grey-bg-192x192px.png b/client/img/logo-grey-bg-192x192px.png
deleted file mode 100644
index 57f1a3f8..00000000
Binary files a/client/img/logo-grey-bg-192x192px.png and /dev/null differ
diff --git a/client/img/logo-grey-bg-512x512px.png b/client/img/logo-grey-bg-512x512px.png
deleted file mode 100644
index e956679f..00000000
Binary files a/client/img/logo-grey-bg-512x512px.png and /dev/null differ
diff --git a/client/img/logo-grey-bg.svg b/client/img/logo-grey-bg.svg
deleted file mode 100644
index f7737548..00000000
--- a/client/img/logo-grey-bg.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/client/img/logo-horizontal-transparent-bg-inverted.svg b/client/img/logo-horizontal-transparent-bg-inverted.svg
deleted file mode 100644
index 53db68da..00000000
--- a/client/img/logo-horizontal-transparent-bg-inverted.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/client/img/logo-horizontal-transparent-bg.svg b/client/img/logo-horizontal-transparent-bg.svg
deleted file mode 100644
index ad81b7da..00000000
--- a/client/img/logo-horizontal-transparent-bg.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/client/img/logo-transparent-bg-inverted.svg b/client/img/logo-transparent-bg-inverted.svg
deleted file mode 100644
index 0c96875b..00000000
--- a/client/img/logo-transparent-bg-inverted.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/client/img/logo-transparent-bg.svg b/client/img/logo-transparent-bg.svg
deleted file mode 100644
index b05918bb..00000000
--- a/client/img/logo-transparent-bg.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/client/img/logo-vertical-transparent-bg-inverted.svg b/client/img/logo-vertical-transparent-bg-inverted.svg
deleted file mode 100644
index 6b8e39e9..00000000
--- a/client/img/logo-vertical-transparent-bg-inverted.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/client/img/logo-vertical-transparent-bg.svg b/client/img/logo-vertical-transparent-bg.svg
deleted file mode 100644
index 56025dc6..00000000
--- a/client/img/logo-vertical-transparent-bg.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/client/img/logo.svg b/client/img/logo.svg
new file mode 100644
index 00000000..2378f20c
--- /dev/null
+++ b/client/img/logo.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/client/img/touch-icon-192x192.png b/client/img/touch-icon-192x192.png
new file mode 100644
index 00000000..976f79cd
Binary files /dev/null and b/client/img/touch-icon-192x192.png differ
diff --git a/client/index.html b/client/index.html
new file mode 100644
index 00000000..edf9ee33
--- /dev/null
+++ b/client/index.html
@@ -0,0 +1,362 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The Lounge
+
+
+
+ ">
+
+
+
+
+
+
+
+ ">
+
+
+
+
+
+
+
+
+
+
+
+
The Lounge is loading…
+
+
+
+
+
+
+
+
+
+
+
Sign in to The Lounge
+
+
+
+ Username
+
+
+
+
+
+ Password
+
+
+
+
+
+
+ Stay signed in
+
+
+
+ Authentication failed.
+
+
+
+ Sign in
+
+
+
+
+
+
+
+
+
+
+
+ <%= public ? "The Lounge - " : "" %>
+ Connect
+ <%= !displayNetwork && lockNetwork ? "to " + defaults.name : "" %>
+
+
+
>
+
+
Network settings
+
+
+ Name
+
+
+
+
+
+ Server
+
+
+ >
+
+
+
+
+ Password
+
+
+
+
+
+
+ <%= typeof(lockNetwork) !== "undefined" && lockNetwork ? "disabled" : "" %>>
+ Enable TLS/SSL
+
+
+
+
+
+
User preferences
+
+
+ Nick
+
+
+
+
+
+ Username
+
+
+
+
+
+ Real name
+
+
+
+
+
+ Channels
+
+
+
+
+
+ Connect
+
+
+
+
+
+
+
+
+
+
Settings
+
+
+
Messages
+
+
+
+
+ Show joins
+
+
+
+
+
+
+ Show parts
+
+
+
+
+
+ Show nick changes
+
+
+
+
+
+ Show mode
+
+
+
+
+
+ Show quits
+
+
+
+
Visual Aids
+
+
+
+
+ Enable colored nicknames
+
+
+ <% if (typeof prefetch === "undefined" || prefetch !== false) { %>
+
+
Links and URLs
+
+
+
+
+ Auto-expand thumbnails
+
+
+
+
+
+ Auto-expand links
+
+
+ <% } %>
+
+
Notifications
+
+
+
+
+ Enable desktop notifications
+ Warning : Desktop notifications are blocked by your web browser
+
+
+
+
+
+ Enable notification sound
+
+
+
+
+
+
+
+ Enable notification for all messages
+
+
+
+
+
+ Custom highlights (comma-separated keywords)
+
+
+
+
+ <% if (!public) { %>
+
+ <% } %>
+
+
Custom Stylesheet
+
+
+
+
+
+
About The Lounge
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/index.html.tpl b/client/index.html.tpl
deleted file mode 100644
index 7275a84f..00000000
--- a/client/index.html.tpl
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- <% _.forEach(stylesheets, function(css) { %>
-
- <% }); %>
-
-
- The Lounge
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- " data-transports="<%- JSON.stringify(transports) %>">
-
-
-
-
-
-
-
The Lounge requires a modern browser with JavaScript enabled.
-
-
-
This is taking longer than it should, there might be connectivity issues.
-
Reload page
-
-
-
-
-
-
-
-
diff --git a/client/js/auth.ts b/client/js/auth.ts
deleted file mode 100644
index 5a764f86..00000000
--- a/client/js/auth.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import storage from "./localStorage";
-import location from "./location";
-
-export default class Auth {
- static signout() {
- storage.clear();
- location.reload();
- }
-}
diff --git a/client/js/autocompletion.ts b/client/js/autocompletion.ts
deleted file mode 100644
index ea3593e0..00000000
--- a/client/js/autocompletion.ts
+++ /dev/null
@@ -1,342 +0,0 @@
-import constants from "./constants";
-
-import Mousetrap from "mousetrap";
-import {Textcomplete, StrategyProps} from "@textcomplete/core";
-import {TextareaEditor} from "@textcomplete/textarea";
-
-import fuzzy from "fuzzy";
-
-import emojiMap from "./helpers/simplemap.json";
-import {store} from "./store";
-import {ChanType} from "../../shared/types/chan";
-
-export default enableAutocomplete;
-
-const emojiSearchTerms = Object.keys(emojiMap);
-const emojiStrategy: StrategyProps = {
- id: "emoji",
- match: /(^|\s):([-+\w:?]{2,}):?$/,
- search(term: string, callback: (matches) => void) {
- // Trim colon from the matched term,
- // as we are unable to get a clean string from match regex
- term = term.replace(/:$/, "");
- callback(fuzzyGrep(term, emojiSearchTerms));
- },
- template([string, original]: [string, string]) {
- return `${String(emojiMap[original])} ${string}`;
- },
- replace([, original]: [string, string]) {
- return "$1" + String(emojiMap[original]);
- },
- index: 2,
-};
-
-const nicksStrategy: StrategyProps = {
- id: "nicks",
- match: /(^|\s)(@([a-zA-Z_[\]\\^{}|`@][a-zA-Z0-9_[\]\\^{}|`-]*)?)$/,
- search(term: string, callback: (matches: string[] | string[][]) => void) {
- term = term.slice(1);
-
- if (term[0] === "@") {
- // TODO: type
- callback(completeNicks(term.slice(1), true).map((val) => ["@" + val[0], "@" + val[1]]));
- } else {
- callback(completeNicks(term, true));
- }
- },
- template([string]: [string, string]) {
- return string;
- },
- replace([, original]: [string, string]) {
- return "$1" + replaceNick(original);
- },
- index: 2,
-};
-
-const chanStrategy: StrategyProps = {
- id: "chans",
- match: /(^|\s)((?:#|\+|&|![A-Z0-9]{5})(?:[^\s]+)?)$/,
- search(term: string, callback: (matches: string[][]) => void) {
- callback(completeChans(term));
- },
- template([string]: [string, string]) {
- return string;
- },
- replace([, original]: [string, string]) {
- return "$1" + original;
- },
- index: 2,
-};
-
-const commandStrategy: StrategyProps = {
- id: "commands",
- match: /^\/(\w*)$/,
- search(term: string, callback: (matches: string[][]) => void) {
- callback(completeCommands("/" + term));
- },
- template([string]: [string, string]) {
- return string;
- },
- replace([, original]: [string, string]) {
- return original;
- },
- index: 1,
-};
-
-const foregroundColorStrategy: StrategyProps = {
- id: "foreground-colors",
- match: /\x03(\d{0,2}|[A-Za-z ]{0,10})$/,
- search(term: string, callback: (matches: string[][]) => void) {
- term = term.toLowerCase();
-
- const matchingColorCodes = constants.colorCodeMap
- .filter((i) => fuzzy.test(term, i[0]) || fuzzy.test(term, i[1]))
- .map((i) => {
- if (fuzzy.test(term, i[1])) {
- return [
- i[0],
- fuzzy.match(term, i[1], {
- pre: "",
- post: " ",
- }).rendered,
- ];
- }
-
- return i;
- });
-
- callback(matchingColorCodes);
- },
- template(value: string[]) {
- return `${value[1]} `;
- },
- replace(value: string) {
- return "\x03" + value[0];
- },
- index: 1,
-};
-
-const backgroundColorStrategy: StrategyProps = {
- id: "background-colors",
- match: /\x03(\d{2}),(\d{0,2}|[A-Za-z ]{0,10})$/,
- search(term: string, callback: (matchingColorCodes: string[][]) => void, match: string[]) {
- term = term.toLowerCase();
- const matchingColorCodes = constants.colorCodeMap
- .filter((i) => fuzzy.test(term, i[0]) || fuzzy.test(term, i[1]))
- .map((pair) => {
- if (fuzzy.test(term, pair[1])) {
- return [
- pair[0],
- fuzzy.match(term, pair[1], {
- pre: "",
- post: " ",
- }).rendered,
- ];
- }
-
- return pair;
- })
- .map((pair) => pair.concat(match[1])); // Needed to pass fg color to `template`...
-
- callback(matchingColorCodes);
- },
- template(value: string[]) {
- return `${value[1]} `;
- },
- replace(value: string[]) {
- return "\x03$1," + value[0];
- },
- index: 2,
-};
-
-function enableAutocomplete(input: HTMLTextAreaElement) {
- let tabCount = 0;
- let lastMatch = "";
- let currentMatches: string[] | string[][] = [];
-
- input.addEventListener("input", (e) => {
- if ((e as CustomEvent).detail === "autocomplete") {
- return;
- }
-
- tabCount = 0;
- currentMatches = [];
- lastMatch = "";
- });
-
- Mousetrap(input).bind(
- "tab",
- (e) => {
- if (store.state.isAutoCompleting) {
- return;
- }
-
- e.preventDefault();
-
- const text = input.value;
-
- if (tabCount === 0) {
- lastMatch = text.substring(0, input.selectionStart).split(/\s/).pop() || "";
-
- if (lastMatch.length === 0) {
- return;
- }
-
- currentMatches = completeNicks(lastMatch, false);
-
- if (currentMatches.length === 0) {
- return;
- }
- }
-
- const position = input.selectionStart - lastMatch.length;
- const newMatch = replaceNick(
- // TODO: type this properly
- String(currentMatches[tabCount % currentMatches.length]),
- position
- );
- const remainder = text.substring(input.selectionStart);
-
- input.value = text.substr(0, position) + newMatch + remainder;
-
- input.selectionStart -= remainder.length;
- input.selectionEnd = input.selectionStart;
-
- // Propagate change to Vue model
- input.dispatchEvent(
- new CustomEvent("input", {
- detail: "autocomplete",
- })
- );
-
- lastMatch = newMatch;
- tabCount++;
- },
- "keydown"
- );
-
- const strategies = [
- emojiStrategy,
- nicksStrategy,
- chanStrategy,
- commandStrategy,
- foregroundColorStrategy,
- backgroundColorStrategy,
- ];
-
- const editor = new TextareaEditor(input);
- const textcomplete = new Textcomplete(editor, strategies, {
- dropdown: {
- className: "textcomplete-menu",
- placement: "top",
- },
- });
-
- textcomplete.on("show", () => {
- store.commit("isAutoCompleting", true);
- });
-
- textcomplete.on("hidden", () => {
- store.commit("isAutoCompleting", false);
- });
-
- return {
- hide() {
- textcomplete.hide();
- },
- destroy() {
- textcomplete.destroy();
- store.commit("isAutoCompleting", false);
- },
- };
-}
-
-function replaceNick(original: string, position = 1) {
- // If no postfix specified, return autocompleted nick as-is
- if (!store.state.settings.nickPostfix) {
- return original;
- }
-
- // If there is whitespace in the input already, append space to nick
- if (position > 0 && /\s/.test(store.state.activeChannel?.channel.pendingMessage || "")) {
- return original + " ";
- }
-
- // If nick is first in the input, append specified postfix
- return original + store.state.settings.nickPostfix;
-}
-
-function fuzzyGrep(term: string, array: Array) {
- const results = fuzzy.filter(term, array, {
- pre: "",
- post: " ",
- });
- return results.map((el) => [el.string, el.original]);
-}
-
-function rawNicks() {
- if (!store.state.activeChannel) {
- return [];
- }
-
- if (store.state.activeChannel.channel.users.length > 0) {
- const users = store.state.activeChannel.channel.users.slice();
-
- return users.sort((a, b) => b.lastMessage - a.lastMessage).map((u) => u.nick);
- }
-
- const me = store.state.activeChannel.network.nick;
- const otherUser = store.state.activeChannel.channel.name;
-
- // If this is a query, add their name to autocomplete
- if (me !== otherUser && store.state.activeChannel.channel.type === ChanType.QUERY) {
- return [otherUser, me];
- }
-
- // Return our own name by default for anything that isn't a channel or query
- return [me];
-}
-
-function completeNicks(word: string, isFuzzy: boolean) {
- const users = rawNicks();
- word = word.toLowerCase();
-
- if (isFuzzy) {
- return fuzzyGrep(word, users);
- }
-
- return users.filter((w) => !w.toLowerCase().indexOf(word));
-}
-
-function getCommands() {
- let cmds = constants.commands.slice();
-
- if (!store.state.settings.searchEnabled) {
- cmds = cmds.filter((c) => c !== "/search");
- }
-
- return cmds;
-}
-
-function completeCommands(word: string) {
- const commands = getCommands();
- return fuzzyGrep(word, commands);
-}
-
-function completeChans(word: string) {
- const words: string[] = [];
-
- if (store.state.activeChannel) {
- for (const channel of store.state.activeChannel.network.channels) {
- // Push all channels that start with the same CHANTYPE
- if (channel.type === ChanType.CHANNEL && channel.name[0] === word[0]) {
- words.push(channel.name);
- }
- }
- }
-
- return fuzzyGrep(word, words);
-}
diff --git a/client/js/chan.ts b/client/js/chan.ts
deleted file mode 100644
index f10db4a8..00000000
--- a/client/js/chan.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import {ClientChan, ClientMessage} from "./types";
-import {SharedNetworkChan} from "../../shared/types/network";
-import {SharedMsg, MessageType} from "../../shared/types/msg";
-import {ChanType} from "../../shared/types/chan";
-
-export function toClientChan(shared: SharedNetworkChan): ClientChan {
- const history: string[] = [""].concat(
- shared.messages
- .filter((m) => m.self && m.text && m.type === MessageType.MESSAGE)
- // TS is too stupid to see the nil guard on filter... so we monkey patch it
- .map((m): string => (m.text ? m.text : ""))
- .reverse()
- .slice(0, 99)
- );
- // filter the unused vars
- const {messages, totalMessages: _, ...props} = shared;
- const channel: ClientChan = {
- ...props,
- editTopic: false,
- pendingMessage: "",
- inputHistoryPosition: 0,
- historyLoading: false,
- scrolledToBottom: true,
- users: [],
- usersOutdated: shared.type === ChanType.CHANNEL ? true : false,
- moreHistoryAvailable: shared.totalMessages > shared.messages.length,
- inputHistory: history,
- messages: sharedMsgToClientMsg(messages),
- };
- return channel;
-}
-
-function sharedMsgToClientMsg(shared: SharedMsg[]): ClientMessage[] {
- // TODO: this is a stub for now, we will want to populate client specific stuff here
- return shared;
-}
diff --git a/client/js/clipboard.ts b/client/js/clipboard.ts
deleted file mode 100644
index 3409b395..00000000
--- a/client/js/clipboard.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-export default function (chat: HTMLDivElement) {
- // Disable in Firefox as it already copies flex text correctly
- // @ts-expect-error Property 'InstallTrigger' does not exist on type 'Window & typeof globalThis'.ts(2339)
- if (typeof window.InstallTrigger !== "undefined") {
- return;
- }
-
- const selection = window.getSelection();
-
- if (!selection) {
- return;
- }
-
- // If selection does not span multiple elements, do nothing
- if (selection.anchorNode === selection.focusNode) {
- return;
- }
-
- const range = selection.getRangeAt(0);
- const documentFragment = range.cloneContents();
- const div = document.createElement("div");
-
- div.id = "js-copy-hack";
- div.appendChild(documentFragment);
- chat.appendChild(div);
-
- selection.selectAllChildren(div);
-
- window.setTimeout(() => {
- chat.removeChild(div);
- selection.removeAllRanges();
- selection.addRange(range);
- }, 0);
-}
diff --git a/client/js/commands/collapse.ts b/client/js/commands/collapse.ts
deleted file mode 100644
index 5c377c0c..00000000
--- a/client/js/commands/collapse.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import socket from "../socket";
-import {store} from "../store";
-
-export function input(): boolean {
- if (!store.state.activeChannel) {
- return false;
- }
-
- const messageIds: number[] = [];
-
- for (const message of store.state.activeChannel.channel.messages) {
- let toggled = false;
-
- for (const preview of message.previews || []) {
- if (preview.shown) {
- preview.shown = false;
- toggled = true;
- }
- }
-
- if (toggled) {
- messageIds.push(message.id);
- }
- }
-
- // Tell the server we're toggling so it remembers at page reload
- if (!document.body.classList.contains("public") && messageIds.length > 0) {
- socket.emit("msg:preview:toggle", {
- target: store.state.activeChannel?.channel.id,
- messageIds: messageIds,
- shown: false,
- });
- }
-
- return true;
-}
diff --git a/client/js/commands/expand.ts b/client/js/commands/expand.ts
deleted file mode 100644
index dbea4510..00000000
--- a/client/js/commands/expand.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import socket from "../socket";
-import {store} from "../store";
-
-export function input(): boolean {
- if (!store.state.activeChannel) {
- return false;
- }
-
- const messageIds: number[] = [];
-
- for (const message of store.state.activeChannel.channel.messages) {
- let toggled = false;
-
- for (const preview of message.previews || []) {
- if (!preview.shown) {
- preview.shown = true;
- toggled = true;
- }
- }
-
- if (toggled) {
- messageIds.push(message.id);
- }
- }
-
- // Tell the server we're toggling so it remembers at page reload
- if (!document.body.classList.contains("public") && messageIds.length > 0) {
- socket.emit("msg:preview:toggle", {
- target: store.state.activeChannel?.channel.id,
- messageIds: messageIds,
- shown: true,
- });
- }
-
- return true;
-}
diff --git a/client/js/commands/index.ts b/client/js/commands/index.ts
deleted file mode 100644
index dd0a0181..00000000
--- a/client/js/commands/index.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import {input as collapse} from "./collapse";
-import {input as expand} from "./expand";
-import {input as join} from "./join";
-import {input as search} from "./search";
-
-export const commands = {
- collapse: collapse,
- expand: expand,
- join: join,
- search: search,
-};
diff --git a/client/js/commands/join.ts b/client/js/commands/join.ts
deleted file mode 100644
index a66a9291..00000000
--- a/client/js/commands/join.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import socket from "../socket";
-import {store} from "../store";
-import {switchToChannel} from "../router";
-import {ChanType} from "../../../shared/types/chan";
-
-export function input(args: string[]): boolean {
- if (args.length > 0) {
- let channels = args[0];
-
- if (channels.length > 0) {
- const chanTypes = store.state.activeChannel?.network.serverOptions.CHANTYPES;
- const channelList = args[0].split(",");
-
- if (chanTypes && chanTypes.length > 0) {
- for (let c = 0; c < channelList.length; c++) {
- if (!chanTypes.includes(channelList[c][0])) {
- channelList[c] = chanTypes[0] + channelList[c];
- }
- }
- }
-
- channels = channelList.join(",");
-
- const chan = store.getters.findChannelOnCurrentNetwork(channels);
-
- if (chan) {
- switchToChannel(chan);
- } else {
- if (store.state.activeChannel) {
- socket.emit("input", {
- text: `/join ${channels} ${args.length > 1 ? args[1] : ""}`,
- target: store.state.activeChannel.channel.id,
- });
- }
-
- return true;
- }
- }
- } else if (store.state.activeChannel?.channel.type === ChanType.CHANNEL) {
- // If `/join` command is used without any arguments, re-join current channel
- socket.emit("input", {
- target: store.state.activeChannel.channel.id,
- text: `/join ${store.state.activeChannel.channel.name}`,
- });
-
- return true;
- }
-
- return false;
-}
diff --git a/client/js/commands/search.ts b/client/js/commands/search.ts
deleted file mode 100644
index 5819b845..00000000
--- a/client/js/commands/search.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import {store} from "../store";
-import {router} from "../router";
-
-export function input(args: string[]): boolean {
- if (!store.state.settings.searchEnabled) {
- return false;
- }
-
- router
- .push({
- name: "SearchResults",
- params: {
- id: store.state.activeChannel?.channel.id,
- },
- query: {
- q: args.join(" "),
- },
- })
- .catch((e: Error) => {
- // eslint-disable-next-line no-console
- console.error(`Failed to push SearchResults route: ${e.message}`);
- });
-
- return true;
-}
diff --git a/client/js/constants.ts b/client/js/constants.ts
deleted file mode 100644
index 725224bd..00000000
--- a/client/js/constants.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-const colorCodeMap = [
- ["00", "White"],
- ["01", "Black"],
- ["02", "Blue"],
- ["03", "Green"],
- ["04", "Red"],
- ["05", "Brown"],
- ["06", "Magenta"],
- ["07", "Orange"],
- ["08", "Yellow"],
- ["09", "Light Green"],
- ["10", "Cyan"],
- ["11", "Light Cyan"],
- ["12", "Light Blue"],
- ["13", "Pink"],
- ["14", "Grey"],
- ["15", "Light Grey"],
-];
-
-const timeFormats = {
- msgDefault: "HH:mm",
- msgWithSeconds: "HH:mm:ss",
- msg12h: "hh:mm A",
- msg12hWithSeconds: "hh:mm:ss A",
-};
-
-export default {
- colorCodeMap,
- commands: [] as string[],
- timeFormats,
- // Same value as media query in CSS that forces sidebars to become overlays
- mobileViewportPixels: 768,
-};
diff --git a/client/js/eventbus.ts b/client/js/eventbus.ts
deleted file mode 100644
index fe065c40..00000000
--- a/client/js/eventbus.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-const events = new Map();
-
-class EventBus {
- /**
- * Register an event handler for the given type.
- *
- * @param {String} type Type of event to listen for.
- * @param {Function} handler Function to call in response to given event.
- */
- on(type: string, handler: (...evt: any[]) => void) {
- if (events.has(type)) {
- events.get(type).push(handler);
- } else {
- events.set(type, [handler]);
- }
- }
-
- /**
- * Remove an event handler for the given type.
- *
- * @param {String} type Type of event to unregister `handler` from.
- * @param {Function} handler Handler function to remove.
- */
- off(type: string, handler: (...evt: any[]) => void) {
- if (events.has(type)) {
- events.set(
- type,
- events.get(type).filter((item: (...evt: any[]) => void) => item !== handler)
- );
- }
- }
-
- /**
- * Invoke all handlers for the given type.
- *
- * @param {String} type The event type to invoke.
- * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler.
- */
- emit(type: string, ...evt: any) {
- if (events.has(type)) {
- events
- .get(type)
- .slice()
- .map((handler: (...evts: any[]) => void) => {
- handler(...evt);
- });
- }
- }
-}
-
-export default new EventBus();
diff --git a/client/js/helpers/collapseNetwork.ts b/client/js/helpers/collapseNetwork.ts
deleted file mode 100644
index 5432bb0e..00000000
--- a/client/js/helpers/collapseNetwork.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import storage from "../localStorage";
-
-export default (network, isCollapsed) => {
- const stored = storage.get("thelounge.networks.collapsed");
- const networks = stored ? new Set(JSON.parse(stored)) : new Set();
-
- network.isCollapsed = isCollapsed;
-
- if (isCollapsed) {
- networks.add(network.uuid);
- } else {
- networks.delete(network.uuid);
- }
-
- storage.set("thelounge.networks.collapsed", JSON.stringify([...networks]));
-};
diff --git a/client/js/helpers/colorClass.ts b/client/js/helpers/colorClass.ts
deleted file mode 100644
index c9896f70..00000000
--- a/client/js/helpers/colorClass.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-// Generates a string from "color-1" to "color-32" based on an input string
-export default (str: string) => {
- let hash = 0;
-
- for (let i = 0; i < str.length; i++) {
- hash += str.charCodeAt(i);
- }
-
- /*
- Modulo 32 lets us be case insensitive for ascii
- due to A being ascii 65 (100 0001)
- while a being ascii 97 (110 0001)
- */
- return "color-" + (1 + (hash % 32)).toString();
-};
diff --git a/client/js/helpers/contextMenu.ts b/client/js/helpers/contextMenu.ts
deleted file mode 100644
index c21b9918..00000000
--- a/client/js/helpers/contextMenu.ts
+++ /dev/null
@@ -1,469 +0,0 @@
-import socket from "../socket";
-import eventbus from "../eventbus";
-import type {ClientChan, ClientNetwork, ClientUser} from "../types";
-import {switchToChannel} from "../router";
-import {TypedStore} from "../store";
-import useCloseChannel from "../hooks/use-close-channel";
-import {ChanType} from "../../../shared/types/chan";
-
-type BaseContextMenuItem = {
- label: string;
- type: string;
- class: string;
-};
-
-type ContextMenuItemWithAction = BaseContextMenuItem & {
- action: () => void;
-};
-
-type ContextMenuItemWithLink = BaseContextMenuItem & {
- link?: string;
-};
-
-type ContextMenuDividerItem = {
- type: "divider";
-};
-
-export type ContextMenuItem =
- | ContextMenuItemWithAction
- | ContextMenuItemWithLink
- | ContextMenuDividerItem;
-
-export function generateChannelContextMenu(
- channel: ClientChan,
- network: ClientNetwork
-): ContextMenuItem[] {
- const closeChannel = useCloseChannel(channel);
-
- const typeMap = {
- lobby: "network",
- channel: "chan",
- query: "query",
- special: "chan",
- };
-
- const closeMap = {
- lobby: "Remove",
- channel: "Leave",
- query: "Close",
- special: "Close",
- };
-
- let items: ContextMenuItem[] = [
- {
- label: channel.name,
- type: "item",
- class: typeMap[channel.type],
- link: `/chan-${channel.id}`,
- },
- {
- type: "divider",
- },
- ];
-
- // Add menu items for lobbies
- if (channel.type === ChanType.LOBBY) {
- items = [
- ...items,
- {
- label: "Edit this network…",
- type: "item",
- class: "edit",
- link: `/edit-network/${network.uuid}`,
- },
- {
- label: "Join a channel…",
- type: "item",
- class: "join",
- action: () => (network.isJoinChannelShown = true),
- },
- {
- label: "List all channels",
- type: "item",
- class: "list",
- action: () =>
- socket.emit("input", {
- target: channel.id,
- text: "/list",
- }),
- },
- {
- label: "List ignored users",
- type: "item",
- class: "list",
- action: () =>
- socket.emit("input", {
- target: channel.id,
- text: "/ignorelist",
- }),
- },
- network.status.connected
- ? {
- label: "Disconnect",
- type: "item",
- class: "disconnect",
- action: () =>
- socket.emit("input", {
- target: channel.id,
- text: "/disconnect",
- }),
- }
- : {
- label: "Connect",
- type: "item",
- class: "connect",
- action: () =>
- socket.emit("input", {
- target: channel.id,
- text: "/connect",
- }),
- },
- ];
- }
-
- // Add menu items for channels
- if (channel.type === ChanType.CHANNEL) {
- items.push({
- label: "Edit topic",
- type: "item",
- class: "edit",
- action() {
- channel.editTopic = true;
- switchToChannel(channel);
- },
- });
- items.push({
- label: "List banned users",
- type: "item",
- class: "list",
- action() {
- socket.emit("input", {
- target: channel.id,
- text: "/banlist",
- });
- },
- });
- }
-
- // Add menu items for queries
- if (channel.type === ChanType.QUERY) {
- items.push(
- {
- label: "User information",
- type: "item",
- class: "action-whois",
- action() {
- switchToChannel(channel);
- socket.emit("input", {
- target: channel.id,
- text: "/whois " + channel.name,
- });
- },
- },
- {
- label: "Ignore user",
- type: "item",
- class: "action-ignore",
- action() {
- socket.emit("input", {
- target: channel.id,
- text: "/ignore " + channel.name,
- });
- },
- }
- );
- }
-
- if (channel.type === ChanType.CHANNEL || channel.type === ChanType.QUERY) {
- items.push({
- label: "Clear history",
- type: "item",
- class: "clear-history",
- action() {
- eventbus.emit(
- "confirm-dialog",
- {
- title: "Clear history",
- text: `Are you sure you want to clear history for ${channel.name}? This cannot be undone.`,
- button: "Clear history",
- },
- (result) => {
- if (!result) {
- return;
- }
-
- socket.emit("history:clear", {
- target: channel.id,
- });
- }
- );
- },
- });
- }
-
- const humanFriendlyChanTypeMap: Record = {
- lobby: "network",
- channel: "channel",
- query: "conversation",
- };
-
- // We don't allow the muting of ChanType.SPECIAL channels
- const mutableChanTypes = Object.keys(humanFriendlyChanTypeMap);
-
- if (mutableChanTypes.includes(channel.type)) {
- const chanType = humanFriendlyChanTypeMap[channel.type];
-
- items.push({
- label: channel.muted ? `Unmute ${chanType}` : `Mute ${chanType}`,
- type: "item",
- class: "mute",
- action() {
- socket.emit("mute:change", {
- target: channel.id,
- setMutedTo: !channel.muted,
- });
- },
- });
- }
-
- // Add close menu item
- items.push({
- label: closeMap[channel.type],
- type: "item",
- class: "close",
- action() {
- closeChannel();
- },
- });
-
- return items;
-}
-
-export function generateInlineChannelContextMenu(
- store: TypedStore,
- chan: string,
- network: ClientNetwork
-): ContextMenuItem[] {
- const join = () => {
- const channel = network.channels.find((c) => c.name === chan);
-
- if (channel) {
- switchToChannel(channel);
- }
-
- if (store.state.activeChannel) {
- socket.emit("input", {
- target: store.state.activeChannel.channel.id,
- text: "/join " + chan,
- });
- } else {
- // eslint-disable-next-line no-console
- console.error("Unable to join channel: activeChannel is undefined");
- }
- };
-
- const channel = network.channels.find((c) => c.name === chan);
-
- if (channel) {
- return [
- {
- label: "Go to channel",
- type: "item",
- class: "chan",
- link: `/chan-${channel.id}`,
- },
- ];
- }
-
- return [
- {
- label: "Join channel",
- type: "item",
- class: "join",
- action: join,
- },
- ];
-}
-
-export function generateUserContextMenu(
- store: TypedStore,
- channel: ClientChan,
- network: ClientNetwork,
- user: Pick
-): ContextMenuItem[] {
- const currentChannelUser: ClientUser | Record = channel
- ? channel.users.find((u) => u.nick === network.nick) || {}
- : {};
-
- const whois = () => {
- const chan = network.channels.find((c) => c.name === user.nick);
-
- if (chan) {
- switchToChannel(chan);
- }
-
- socket.emit("input", {
- target: channel.id,
- text: "/whois " + user.nick,
- });
- };
-
- const items: ContextMenuItem[] = [
- {
- label: user.nick,
- type: "item",
- class: "user",
- action: whois,
- },
- {
- type: "divider",
- },
- {
- label: "User information",
- type: "item",
- class: "action-whois",
- action: whois,
- },
- {
- label: "Ignore user",
- type: "item",
- class: "action-ignore",
- action() {
- socket.emit("input", {
- target: channel.id,
- text: "/ignore " + user.nick,
- });
- },
- },
- {
- label: "Direct messages",
- type: "item",
- class: "action-query",
- action() {
- const chan = store.getters.findChannelOnCurrentNetwork(user.nick);
-
- if (chan) {
- switchToChannel(chan);
- }
-
- socket.emit("input", {
- target: channel.id,
- text: "/query " + user.nick,
- });
- },
- },
- ];
-
- // Bail because we're in a query or we don't have a special mode.
- if (!currentChannelUser.modes || currentChannelUser.modes.length < 1) {
- return items;
- }
-
- // Names of the standard modes we are able to change
- const modeCharToName = {
- "~": "owner",
- "&": "admin",
- "@": "operator",
- "%": "half-op",
- "+": "voice",
- };
-
- // Labels for the mode changes. For example .rev({mode: "a", symbol: "&"}) => 'Revoke admin (-a)'
- const modeTextTemplate = {
- revoke(m: {symbol: string; mode: string}) {
- const name = modeCharToName[m.symbol];
-
- if (typeof name !== "string") {
- return "";
- }
-
- const res = name ? `Revoke ${name} (-${m.mode})` : `Mode -${m.mode}`;
- return res;
- },
- give(m: {symbol: string; mode: string}) {
- const name = modeCharToName[m.symbol];
-
- if (typeof name !== "string") {
- return "";
- }
-
- const res = name ? `Give ${name} (+${m.mode})` : `Mode +${m.mode}`;
- return res;
- },
- };
-
- const networkModeSymbols = network.serverOptions.PREFIX.symbols;
-
- /**
- * Determine whether the prefix of mode p1 has access to perform actions on p2.
- *
- * EXAMPLE:
- * compare('@', '@') => true
- * compare('&', '@') => true
- * compare('+', '~') => false
- * @param {string} p1 The mode performing an action
- * @param {string} p2 The target mode
- *
- * @return {boolean} whether p1 can perform an action on p2
- */
- function compare(p1: string, p2: string): boolean {
- // The modes ~ and @ can perform actions on their own mode. The others on modes below.
- return "~@".indexOf(p1) > -1
- ? networkModeSymbols.indexOf(p1) <= networkModeSymbols.indexOf(p2)
- : networkModeSymbols.indexOf(p1) < networkModeSymbols.indexOf(p2);
- }
-
- network.serverOptions.PREFIX.prefix.forEach((mode) => {
- if (!compare(currentChannelUser.modes[0], mode.symbol)) {
- // Our highest mode is below the current mode. Bail.
- return;
- }
-
- if (!user.modes.includes(mode.symbol)) {
- // The target doesn't already have this mode, therefore we can set it.
- items.push({
- label: modeTextTemplate.give(mode),
- type: "item",
- class: "action-set-mode",
- action() {
- socket.emit("input", {
- target: channel.id,
- text: "/mode +" + mode.mode + " " + user.nick,
- });
- },
- });
- } else {
- items.push({
- label: modeTextTemplate.revoke(mode),
- type: "item",
- class: "action-revoke-mode",
- action() {
- socket.emit("input", {
- target: channel.id,
- text: "/mode -" + mode.mode + " " + user.nick,
- });
- },
- });
- }
- });
-
- // Determine if we are half-op or op depending on the network modes so we can kick.
- if (!compare(networkModeSymbols.indexOf("%") > -1 ? "%" : "@", currentChannelUser.modes[0])) {
- // Check if the target user has no mode or a mode lower than ours.
- if (user.modes.length === 0 || compare(currentChannelUser.modes[0], user.modes[0])) {
- items.push({
- label: "Kick",
- type: "item",
- class: "action-kick",
- action() {
- socket.emit("input", {
- target: channel.id,
- text: "/kick " + user.nick,
- });
- },
- });
- }
- }
-
- return items;
-}
diff --git a/client/js/helpers/distance.ts b/client/js/helpers/distance.ts
deleted file mode 100644
index 8e9db070..00000000
--- a/client/js/helpers/distance.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-function distance([x1, y1]: [number, number], [x2, y2]: [number, number]) {
- return Math.hypot(x1 - x2, y1 - y2);
-}
-
-export default distance;
diff --git a/client/js/helpers/friendlysize.ts b/client/js/helpers/friendlysize.ts
deleted file mode 100644
index d29ba73f..00000000
--- a/client/js/helpers/friendlysize.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-const sizes = ["Bytes", "KiB", "MiB", "GiB", "TiB", "PiB"];
-
-export default (size: number) => {
- // Loosely inspired from https://stackoverflow.com/a/18650828/1935861
- const i = size > 0 ? Math.floor(Math.log(size) / Math.log(1024)) : 0;
- const fixedSize = parseFloat((size / Math.pow(1024, i)).toFixed(1));
- return `${fixedSize} ${sizes[i]}`;
-};
diff --git a/client/js/helpers/fullnamemap.json b/client/js/helpers/fullnamemap.json
deleted file mode 100644
index e4018c57..00000000
--- a/client/js/helpers/fullnamemap.json
+++ /dev/null
@@ -1,1872 +0,0 @@
-{
- "😀": "grinning face",
- "😃": "grinning face with big eyes",
- "😄": "grinning face with smiling eyes",
- "😁": "beaming face with smiling eyes",
- "😆": "grinning squinting face",
- "😅": "grinning face with sweat",
- "🤣": "rolling on the floor laughing",
- "😂": "face with tears of joy",
- "🙂": "slightly smiling face",
- "🙃": "upside-down face",
- "🫠": "melting face",
- "😉": "winking face",
- "😊": "smiling face with smiling eyes",
- "😇": "smiling face with halo",
- "🥰": "smiling face with hearts",
- "😍": "smiling face with heart-eyes",
- "🤩": "star-struck",
- "😘": "face blowing a kiss",
- "😗": "kissing face",
- "☺": "smiling face",
- "😚": "kissing face with closed eyes",
- "😙": "kissing face with smiling eyes",
- "🥲": "smiling face with tear",
- "😋": "face savoring food",
- "😛": "face with tongue",
- "😜": "winking face with tongue",
- "🤪": "zany face",
- "😝": "squinting face with tongue",
- "🤑": "money-mouth face",
- "🤗": "smiling face with open hands",
- "🤭": "face with hand over mouth",
- "🫢": "face with open eyes and hand over mouth",
- "🫣": "face with peeking eye",
- "🤫": "shushing face",
- "🤔": "thinking face",
- "🫡": "saluting face",
- "🤐": "zipper-mouth face",
- "🤨": "face with raised eyebrow",
- "😐": "neutral face",
- "😑": "expressionless face",
- "😶": "face without mouth",
- "🫥": "dotted line face",
- "😶🌫": "face in clouds",
- "😏": "smirking face",
- "😒": "unamused face",
- "🙄": "face with rolling eyes",
- "😬": "grimacing face",
- "😮💨": "face exhaling",
- "🤥": "lying face",
- "🫨": "shaking face",
- "😌": "relieved face",
- "😔": "pensive face",
- "😪": "sleepy face",
- "🤤": "drooling face",
- "😴": "sleeping face",
- "😷": "face with medical mask",
- "🤒": "face with thermometer",
- "🤕": "face with head-bandage",
- "🤢": "nauseated face",
- "🤮": "face vomiting",
- "🤧": "sneezing face",
- "🥵": "hot face",
- "🥶": "cold face",
- "🥴": "woozy face",
- "😵": "face with crossed-out eyes",
- "😵💫": "face with spiral eyes",
- "🤯": "exploding head",
- "🤠": "cowboy hat face",
- "🥳": "partying face",
- "🥸": "disguised face",
- "😎": "smiling face with sunglasses",
- "🤓": "nerd face",
- "🧐": "face with monocle",
- "😕": "confused face",
- "🫤": "face with diagonal mouth",
- "😟": "worried face",
- "🙁": "slightly frowning face",
- "☹": "frowning face",
- "😮": "face with open mouth",
- "😯": "hushed face",
- "😲": "astonished face",
- "😳": "flushed face",
- "🥺": "pleading face",
- "🥹": "face holding back tears",
- "😦": "frowning face with open mouth",
- "😧": "anguished face",
- "😨": "fearful face",
- "😰": "anxious face with sweat",
- "😥": "sad but relieved face",
- "😢": "crying face",
- "😭": "loudly crying face",
- "😱": "face screaming in fear",
- "😖": "confounded face",
- "😣": "persevering face",
- "😞": "disappointed face",
- "😓": "downcast face with sweat",
- "😩": "weary face",
- "😫": "tired face",
- "🥱": "yawning face",
- "😤": "face with steam from nose",
- "😡": "enraged face",
- "😠": "angry face",
- "🤬": "face with symbols on mouth",
- "😈": "smiling face with horns",
- "👿": "angry face with horns",
- "💀": "skull",
- "☠": "skull and crossbones",
- "💩": "pile of poo",
- "🤡": "clown face",
- "👹": "ogre",
- "👺": "goblin",
- "👻": "ghost",
- "👽": "alien",
- "👾": "alien monster",
- "🤖": "robot",
- "😺": "grinning cat",
- "😸": "grinning cat with smiling eyes",
- "😹": "cat with tears of joy",
- "😻": "smiling cat with heart-eyes",
- "😼": "cat with wry smile",
- "😽": "kissing cat",
- "🙀": "weary cat",
- "😿": "crying cat",
- "😾": "pouting cat",
- "🙈": "see-no-evil monkey",
- "🙉": "hear-no-evil monkey",
- "🙊": "speak-no-evil monkey",
- "💌": "love letter",
- "💘": "heart with arrow",
- "💝": "heart with ribbon",
- "💖": "sparkling heart",
- "💗": "growing heart",
- "💓": "beating heart",
- "💞": "revolving hearts",
- "💕": "two hearts",
- "💟": "heart decoration",
- "❣": "heart exclamation",
- "💔": "broken heart",
- "❤🔥": "heart on fire",
- "❤🩹": "mending heart",
- "❤": "red heart",
- "🩷": "pink heart",
- "🧡": "orange heart",
- "💛": "yellow heart",
- "💚": "green heart",
- "💙": "blue heart",
- "🩵": "light blue heart",
- "💜": "purple heart",
- "🤎": "brown heart",
- "🖤": "black heart",
- "🩶": "grey heart",
- "🤍": "white heart",
- "💋": "kiss mark",
- "💯": "hundred points",
- "💢": "anger symbol",
- "💥": "collision",
- "💫": "dizzy",
- "💦": "sweat droplets",
- "💨": "dashing away",
- "🕳": "hole",
- "💬": "speech balloon",
- "👁🗨": "eye in speech bubble",
- "🗨": "left speech bubble",
- "🗯": "right anger bubble",
- "💭": "thought balloon",
- "💤": "ZZZ",
- "👋": "waving hand",
- "🤚": "raised back of hand",
- "🖐": "hand with fingers splayed",
- "✋": "raised hand",
- "🖖": "vulcan salute",
- "🫱": "rightwards hand",
- "🫲": "leftwards hand",
- "🫳": "palm down hand",
- "🫴": "palm up hand",
- "🫷": "leftwards pushing hand",
- "🫸": "rightwards pushing hand",
- "👌": "OK hand",
- "🤌": "pinched fingers",
- "🤏": "pinching hand",
- "✌": "victory hand",
- "🤞": "crossed fingers",
- "🫰": "hand with index finger and thumb crossed",
- "🤟": "love-you gesture",
- "🤘": "sign of the horns",
- "🤙": "call me hand",
- "👈": "backhand index pointing left",
- "👉": "backhand index pointing right",
- "👆": "backhand index pointing up",
- "🖕": "middle finger",
- "👇": "backhand index pointing down",
- "☝": "index pointing up",
- "🫵": "index pointing at the viewer",
- "👍": "thumbs up",
- "👎": "thumbs down",
- "✊": "raised fist",
- "👊": "oncoming fist",
- "🤛": "left-facing fist",
- "🤜": "right-facing fist",
- "👏": "clapping hands",
- "🙌": "raising hands",
- "🫶": "heart hands",
- "👐": "open hands",
- "🤲": "palms up together",
- "🤝": "handshake",
- "🙏": "folded hands",
- "✍": "writing hand",
- "💅": "nail polish",
- "🤳": "selfie",
- "💪": "flexed biceps",
- "🦾": "mechanical arm",
- "🦿": "mechanical leg",
- "🦵": "leg",
- "🦶": "foot",
- "👂": "ear",
- "🦻": "ear with hearing aid",
- "👃": "nose",
- "🧠": "brain",
- "🫀": "anatomical heart",
- "🫁": "lungs",
- "🦷": "tooth",
- "🦴": "bone",
- "👀": "eyes",
- "👁": "eye",
- "👅": "tongue",
- "👄": "mouth",
- "🫦": "biting lip",
- "👶": "baby",
- "🧒": "child",
- "👦": "boy",
- "👧": "girl",
- "🧑": "person",
- "👱": "person: blond hair",
- "👨": "man",
- "🧔": "person: beard",
- "🧔♂": "man: beard",
- "🧔♀": "woman: beard",
- "👨🦰": "man: red hair",
- "👨🦱": "man: curly hair",
- "👨🦳": "man: white hair",
- "👨🦲": "man: bald",
- "👩": "woman",
- "👩🦰": "woman: red hair",
- "🧑🦰": "person: red hair",
- "👩🦱": "woman: curly hair",
- "🧑🦱": "person: curly hair",
- "👩🦳": "woman: white hair",
- "🧑🦳": "person: white hair",
- "👩🦲": "woman: bald",
- "🧑🦲": "person: bald",
- "👱♀": "woman: blond hair",
- "👱♂": "man: blond hair",
- "🧓": "older person",
- "👴": "old man",
- "👵": "old woman",
- "🙍": "person frowning",
- "🙍♂": "man frowning",
- "🙍♀": "woman frowning",
- "🙎": "person pouting",
- "🙎♂": "man pouting",
- "🙎♀": "woman pouting",
- "🙅": "person gesturing NO",
- "🙅♂": "man gesturing NO",
- "🙅♀": "woman gesturing NO",
- "🙆": "person gesturing OK",
- "🙆♂": "man gesturing OK",
- "🙆♀": "woman gesturing OK",
- "💁": "person tipping hand",
- "💁♂": "man tipping hand",
- "💁♀": "woman tipping hand",
- "🙋": "person raising hand",
- "🙋♂": "man raising hand",
- "🙋♀": "woman raising hand",
- "🧏": "deaf person",
- "🧏♂": "deaf man",
- "🧏♀": "deaf woman",
- "🙇": "person bowing",
- "🙇♂": "man bowing",
- "🙇♀": "woman bowing",
- "🤦": "person facepalming",
- "🤦♂": "man facepalming",
- "🤦♀": "woman facepalming",
- "🤷": "person shrugging",
- "🤷♂": "man shrugging",
- "🤷♀": "woman shrugging",
- "🧑⚕": "health worker",
- "👨⚕": "man health worker",
- "👩⚕": "woman health worker",
- "🧑🎓": "student",
- "👨🎓": "man student",
- "👩🎓": "woman student",
- "🧑🏫": "teacher",
- "👨🏫": "man teacher",
- "👩🏫": "woman teacher",
- "🧑⚖": "judge",
- "👨⚖": "man judge",
- "👩⚖": "woman judge",
- "🧑🌾": "farmer",
- "👨🌾": "man farmer",
- "👩🌾": "woman farmer",
- "🧑🍳": "cook",
- "👨🍳": "man cook",
- "👩🍳": "woman cook",
- "🧑🔧": "mechanic",
- "👨🔧": "man mechanic",
- "👩🔧": "woman mechanic",
- "🧑🏭": "factory worker",
- "👨🏭": "man factory worker",
- "👩🏭": "woman factory worker",
- "🧑💼": "office worker",
- "👨💼": "man office worker",
- "👩💼": "woman office worker",
- "🧑🔬": "scientist",
- "👨🔬": "man scientist",
- "👩🔬": "woman scientist",
- "🧑💻": "technologist",
- "👨💻": "man technologist",
- "👩💻": "woman technologist",
- "🧑🎤": "singer",
- "👨🎤": "man singer",
- "👩🎤": "woman singer",
- "🧑🎨": "artist",
- "👨🎨": "man artist",
- "👩🎨": "woman artist",
- "🧑✈": "pilot",
- "👨✈": "man pilot",
- "👩✈": "woman pilot",
- "🧑🚀": "astronaut",
- "👨🚀": "man astronaut",
- "👩🚀": "woman astronaut",
- "🧑🚒": "firefighter",
- "👨🚒": "man firefighter",
- "👩🚒": "woman firefighter",
- "👮": "police officer",
- "👮♂": "man police officer",
- "👮♀": "woman police officer",
- "🕵": "detective",
- "🕵♂": "man detective",
- "🕵♀": "woman detective",
- "💂": "guard",
- "💂♂": "man guard",
- "💂♀": "woman guard",
- "🥷": "ninja",
- "👷": "construction worker",
- "👷♂": "man construction worker",
- "👷♀": "woman construction worker",
- "🫅": "person with crown",
- "🤴": "prince",
- "👸": "princess",
- "👳": "person wearing turban",
- "👳♂": "man wearing turban",
- "👳♀": "woman wearing turban",
- "👲": "person with skullcap",
- "🧕": "woman with headscarf",
- "🤵": "person in tuxedo",
- "🤵♂": "man in tuxedo",
- "🤵♀": "woman in tuxedo",
- "👰": "person with veil",
- "👰♂": "man with veil",
- "👰♀": "woman with veil",
- "🤰": "pregnant woman",
- "🫃": "pregnant man",
- "🫄": "pregnant person",
- "🤱": "breast-feeding",
- "👩🍼": "woman feeding baby",
- "👨🍼": "man feeding baby",
- "🧑🍼": "person feeding baby",
- "👼": "baby angel",
- "🎅": "Santa Claus",
- "🤶": "Mrs. Claus",
- "🧑🎄": "mx claus",
- "🦸": "superhero",
- "🦸♂": "man superhero",
- "🦸♀": "woman superhero",
- "🦹": "supervillain",
- "🦹♂": "man supervillain",
- "🦹♀": "woman supervillain",
- "🧙": "mage",
- "🧙♂": "man mage",
- "🧙♀": "woman mage",
- "🧚": "fairy",
- "🧚♂": "man fairy",
- "🧚♀": "woman fairy",
- "🧛": "vampire",
- "🧛♂": "man vampire",
- "🧛♀": "woman vampire",
- "🧜": "merperson",
- "🧜♂": "merman",
- "🧜♀": "mermaid",
- "🧝": "elf",
- "🧝♂": "man elf",
- "🧝♀": "woman elf",
- "🧞": "genie",
- "🧞♂": "man genie",
- "🧞♀": "woman genie",
- "🧟": "zombie",
- "🧟♂": "man zombie",
- "🧟♀": "woman zombie",
- "🧌": "troll",
- "💆": "person getting massage",
- "💆♂": "man getting massage",
- "💆♀": "woman getting massage",
- "💇": "person getting haircut",
- "💇♂": "man getting haircut",
- "💇♀": "woman getting haircut",
- "🚶": "person walking",
- "🚶♂": "man walking",
- "🚶♀": "woman walking",
- "🧍": "person standing",
- "🧍♂": "man standing",
- "🧍♀": "woman standing",
- "🧎": "person kneeling",
- "🧎♂": "man kneeling",
- "🧎♀": "woman kneeling",
- "🧑🦯": "person with white cane",
- "👨🦯": "man with white cane",
- "👩🦯": "woman with white cane",
- "🧑🦼": "person in motorized wheelchair",
- "👨🦼": "man in motorized wheelchair",
- "👩🦼": "woman in motorized wheelchair",
- "🧑🦽": "person in manual wheelchair",
- "👨🦽": "man in manual wheelchair",
- "👩🦽": "woman in manual wheelchair",
- "🏃": "person running",
- "🏃♂": "man running",
- "🏃♀": "woman running",
- "💃": "woman dancing",
- "🕺": "man dancing",
- "🕴": "person in suit levitating",
- "👯": "people with bunny ears",
- "👯♂": "men with bunny ears",
- "👯♀": "women with bunny ears",
- "🧖": "person in steamy room",
- "🧖♂": "man in steamy room",
- "🧖♀": "woman in steamy room",
- "🧗": "person climbing",
- "🧗♂": "man climbing",
- "🧗♀": "woman climbing",
- "🤺": "person fencing",
- "🏇": "horse racing",
- "⛷": "skier",
- "🏂": "snowboarder",
- "🏌": "person golfing",
- "🏌♂": "man golfing",
- "🏌♀": "woman golfing",
- "🏄": "person surfing",
- "🏄♂": "man surfing",
- "🏄♀": "woman surfing",
- "🚣": "person rowing boat",
- "🚣♂": "man rowing boat",
- "🚣♀": "woman rowing boat",
- "🏊": "person swimming",
- "🏊♂": "man swimming",
- "🏊♀": "woman swimming",
- "⛹": "person bouncing ball",
- "⛹♂": "man bouncing ball",
- "⛹♀": "woman bouncing ball",
- "🏋": "person lifting weights",
- "🏋♂": "man lifting weights",
- "🏋♀": "woman lifting weights",
- "🚴": "person biking",
- "🚴♂": "man biking",
- "🚴♀": "woman biking",
- "🚵": "person mountain biking",
- "🚵♂": "man mountain biking",
- "🚵♀": "woman mountain biking",
- "🤸": "person cartwheeling",
- "🤸♂": "man cartwheeling",
- "🤸♀": "woman cartwheeling",
- "🤼": "people wrestling",
- "🤼♂": "men wrestling",
- "🤼♀": "women wrestling",
- "🤽": "person playing water polo",
- "🤽♂": "man playing water polo",
- "🤽♀": "woman playing water polo",
- "🤾": "person playing handball",
- "🤾♂": "man playing handball",
- "🤾♀": "woman playing handball",
- "🤹": "person juggling",
- "🤹♂": "man juggling",
- "🤹♀": "woman juggling",
- "🧘": "person in lotus position",
- "🧘♂": "man in lotus position",
- "🧘♀": "woman in lotus position",
- "🛀": "person taking bath",
- "🛌": "person in bed",
- "🧑🤝🧑": "people holding hands",
- "👭": "women holding hands",
- "👫": "woman and man holding hands",
- "👬": "men holding hands",
- "💏": "kiss",
- "👩❤💋👨": "kiss: woman, man",
- "👨❤💋👨": "kiss: man, man",
- "👩❤💋👩": "kiss: woman, woman",
- "💑": "couple with heart",
- "👩❤👨": "couple with heart: woman, man",
- "👨❤👨": "couple with heart: man, man",
- "👩❤👩": "couple with heart: woman, woman",
- "👪": "family",
- "👨👩👦": "family: man, woman, boy",
- "👨👩👧": "family: man, woman, girl",
- "👨👩👧👦": "family: man, woman, girl, boy",
- "👨👩👦👦": "family: man, woman, boy, boy",
- "👨👩👧👧": "family: man, woman, girl, girl",
- "👨👨👦": "family: man, man, boy",
- "👨👨👧": "family: man, man, girl",
- "👨👨👧👦": "family: man, man, girl, boy",
- "👨👨👦👦": "family: man, man, boy, boy",
- "👨👨👧👧": "family: man, man, girl, girl",
- "👩👩👦": "family: woman, woman, boy",
- "👩👩👧": "family: woman, woman, girl",
- "👩👩👧👦": "family: woman, woman, girl, boy",
- "👩👩👦👦": "family: woman, woman, boy, boy",
- "👩👩👧👧": "family: woman, woman, girl, girl",
- "👨👦": "family: man, boy",
- "👨👦👦": "family: man, boy, boy",
- "👨👧": "family: man, girl",
- "👨👧👦": "family: man, girl, boy",
- "👨👧👧": "family: man, girl, girl",
- "👩👦": "family: woman, boy",
- "👩👦👦": "family: woman, boy, boy",
- "👩👧": "family: woman, girl",
- "👩👧👦": "family: woman, girl, boy",
- "👩👧👧": "family: woman, girl, girl",
- "🗣": "speaking head",
- "👤": "bust in silhouette",
- "👥": "busts in silhouette",
- "🫂": "people hugging",
- "👣": "footprints",
- "🐵": "monkey face",
- "🐒": "monkey",
- "🦍": "gorilla",
- "🦧": "orangutan",
- "🐶": "dog face",
- "🐕": "dog",
- "🦮": "guide dog",
- "🐕🦺": "service dog",
- "🐩": "poodle",
- "🐺": "wolf",
- "🦊": "fox",
- "🦝": "raccoon",
- "🐱": "cat face",
- "🐈": "cat",
- "🐈⬛": "black cat",
- "🦁": "lion",
- "🐯": "tiger face",
- "🐅": "tiger",
- "🐆": "leopard",
- "🐴": "horse face",
- "🫎": "moose",
- "🫏": "donkey",
- "🐎": "horse",
- "🦄": "unicorn",
- "🦓": "zebra",
- "🦌": "deer",
- "🦬": "bison",
- "🐮": "cow face",
- "🐂": "ox",
- "🐃": "water buffalo",
- "🐄": "cow",
- "🐷": "pig face",
- "🐖": "pig",
- "🐗": "boar",
- "🐽": "pig nose",
- "🐏": "ram",
- "🐑": "ewe",
- "🐐": "goat",
- "🐪": "camel",
- "🐫": "two-hump camel",
- "🦙": "llama",
- "🦒": "giraffe",
- "🐘": "elephant",
- "🦣": "mammoth",
- "🦏": "rhinoceros",
- "🦛": "hippopotamus",
- "🐭": "mouse face",
- "🐁": "mouse",
- "🐀": "rat",
- "🐹": "hamster",
- "🐰": "rabbit face",
- "🐇": "rabbit",
- "🐿": "chipmunk",
- "🦫": "beaver",
- "🦔": "hedgehog",
- "🦇": "bat",
- "🐻": "bear",
- "🐻❄": "polar bear",
- "🐨": "koala",
- "🐼": "panda",
- "🦥": "sloth",
- "🦦": "otter",
- "🦨": "skunk",
- "🦘": "kangaroo",
- "🦡": "badger",
- "🐾": "paw prints",
- "🦃": "turkey",
- "🐔": "chicken",
- "🐓": "rooster",
- "🐣": "hatching chick",
- "🐤": "baby chick",
- "🐥": "front-facing baby chick",
- "🐦": "bird",
- "🐧": "penguin",
- "🕊": "dove",
- "🦅": "eagle",
- "🦆": "duck",
- "🦢": "swan",
- "🦉": "owl",
- "🦤": "dodo",
- "🪶": "feather",
- "🦩": "flamingo",
- "🦚": "peacock",
- "🦜": "parrot",
- "🪽": "wing",
- "🐦⬛": "black bird",
- "🪿": "goose",
- "🐸": "frog",
- "🐊": "crocodile",
- "🐢": "turtle",
- "🦎": "lizard",
- "🐍": "snake",
- "🐲": "dragon face",
- "🐉": "dragon",
- "🦕": "sauropod",
- "🦖": "T-Rex",
- "🐳": "spouting whale",
- "🐋": "whale",
- "🐬": "dolphin",
- "🦭": "seal",
- "🐟": "fish",
- "🐠": "tropical fish",
- "🐡": "blowfish",
- "🦈": "shark",
- "🐙": "octopus",
- "🐚": "spiral shell",
- "🪸": "coral",
- "🪼": "jellyfish",
- "🐌": "snail",
- "🦋": "butterfly",
- "🐛": "bug",
- "🐜": "ant",
- "🐝": "honeybee",
- "🪲": "beetle",
- "🐞": "lady beetle",
- "🦗": "cricket",
- "🪳": "cockroach",
- "🕷": "spider",
- "🕸": "spider web",
- "🦂": "scorpion",
- "🦟": "mosquito",
- "🪰": "fly",
- "🪱": "worm",
- "🦠": "microbe",
- "💐": "bouquet",
- "🌸": "cherry blossom",
- "💮": "white flower",
- "🪷": "lotus",
- "🏵": "rosette",
- "🌹": "rose",
- "🥀": "wilted flower",
- "🌺": "hibiscus",
- "🌻": "sunflower",
- "🌼": "blossom",
- "🌷": "tulip",
- "🪻": "hyacinth",
- "🌱": "seedling",
- "🪴": "potted plant",
- "🌲": "evergreen tree",
- "🌳": "deciduous tree",
- "🌴": "palm tree",
- "🌵": "cactus",
- "🌾": "sheaf of rice",
- "🌿": "herb",
- "☘": "shamrock",
- "🍀": "four leaf clover",
- "🍁": "maple leaf",
- "🍂": "fallen leaf",
- "🍃": "leaf fluttering in wind",
- "🪹": "empty nest",
- "🪺": "nest with eggs",
- "🍄": "mushroom",
- "🍇": "grapes",
- "🍈": "melon",
- "🍉": "watermelon",
- "🍊": "tangerine",
- "🍋": "lemon",
- "🍌": "banana",
- "🍍": "pineapple",
- "🥭": "mango",
- "🍎": "red apple",
- "🍏": "green apple",
- "🍐": "pear",
- "🍑": "peach",
- "🍒": "cherries",
- "🍓": "strawberry",
- "🫐": "blueberries",
- "🥝": "kiwi fruit",
- "🍅": "tomato",
- "🫒": "olive",
- "🥥": "coconut",
- "🥑": "avocado",
- "🍆": "eggplant",
- "🥔": "potato",
- "🥕": "carrot",
- "🌽": "ear of corn",
- "🌶": "hot pepper",
- "🫑": "bell pepper",
- "🥒": "cucumber",
- "🥬": "leafy green",
- "🥦": "broccoli",
- "🧄": "garlic",
- "🧅": "onion",
- "🥜": "peanuts",
- "🫘": "beans",
- "🌰": "chestnut",
- "🫚": "ginger root",
- "🫛": "pea pod",
- "🍞": "bread",
- "🥐": "croissant",
- "🥖": "baguette bread",
- "🫓": "flatbread",
- "🥨": "pretzel",
- "🥯": "bagel",
- "🥞": "pancakes",
- "🧇": "waffle",
- "🧀": "cheese wedge",
- "🍖": "meat on bone",
- "🍗": "poultry leg",
- "🥩": "cut of meat",
- "🥓": "bacon",
- "🍔": "hamburger",
- "🍟": "french fries",
- "🍕": "pizza",
- "🌭": "hot dog",
- "🥪": "sandwich",
- "🌮": "taco",
- "🌯": "burrito",
- "🫔": "tamale",
- "🥙": "stuffed flatbread",
- "🧆": "falafel",
- "🥚": "egg",
- "🍳": "cooking",
- "🥘": "shallow pan of food",
- "🍲": "pot of food",
- "🫕": "fondue",
- "🥣": "bowl with spoon",
- "🥗": "green salad",
- "🍿": "popcorn",
- "🧈": "butter",
- "🧂": "salt",
- "🥫": "canned food",
- "🍱": "bento box",
- "🍘": "rice cracker",
- "🍙": "rice ball",
- "🍚": "cooked rice",
- "🍛": "curry rice",
- "🍜": "steaming bowl",
- "🍝": "spaghetti",
- "🍠": "roasted sweet potato",
- "🍢": "oden",
- "🍣": "sushi",
- "🍤": "fried shrimp",
- "🍥": "fish cake with swirl",
- "🥮": "moon cake",
- "🍡": "dango",
- "🥟": "dumpling",
- "🥠": "fortune cookie",
- "🥡": "takeout box",
- "🦀": "crab",
- "🦞": "lobster",
- "🦐": "shrimp",
- "🦑": "squid",
- "🦪": "oyster",
- "🍦": "soft ice cream",
- "🍧": "shaved ice",
- "🍨": "ice cream",
- "🍩": "doughnut",
- "🍪": "cookie",
- "🎂": "birthday cake",
- "🍰": "shortcake",
- "🧁": "cupcake",
- "🥧": "pie",
- "🍫": "chocolate bar",
- "🍬": "candy",
- "🍭": "lollipop",
- "🍮": "custard",
- "🍯": "honey pot",
- "🍼": "baby bottle",
- "🥛": "glass of milk",
- "☕": "hot beverage",
- "🫖": "teapot",
- "🍵": "teacup without handle",
- "🍶": "sake",
- "🍾": "bottle with popping cork",
- "🍷": "wine glass",
- "🍸": "cocktail glass",
- "🍹": "tropical drink",
- "🍺": "beer mug",
- "🍻": "clinking beer mugs",
- "🥂": "clinking glasses",
- "🥃": "tumbler glass",
- "🫗": "pouring liquid",
- "🥤": "cup with straw",
- "🧋": "bubble tea",
- "🧃": "beverage box",
- "🧉": "mate",
- "🧊": "ice",
- "🥢": "chopsticks",
- "🍽": "fork and knife with plate",
- "🍴": "fork and knife",
- "🥄": "spoon",
- "🔪": "kitchen knife",
- "🫙": "jar",
- "🏺": "amphora",
- "🌍": "globe showing Europe-Africa",
- "🌎": "globe showing Americas",
- "🌏": "globe showing Asia-Australia",
- "🌐": "globe with meridians",
- "🗺": "world map",
- "🗾": "map of Japan",
- "🧭": "compass",
- "🏔": "snow-capped mountain",
- "⛰": "mountain",
- "🌋": "volcano",
- "🗻": "mount fuji",
- "🏕": "camping",
- "🏖": "beach with umbrella",
- "🏜": "desert",
- "🏝": "desert island",
- "🏞": "national park",
- "🏟": "stadium",
- "🏛": "classical building",
- "🏗": "building construction",
- "🧱": "brick",
- "🪨": "rock",
- "🪵": "wood",
- "🛖": "hut",
- "🏘": "houses",
- "🏚": "derelict house",
- "🏠": "house",
- "🏡": "house with garden",
- "🏢": "office building",
- "🏣": "Japanese post office",
- "🏤": "post office",
- "🏥": "hospital",
- "🏦": "bank",
- "🏨": "hotel",
- "🏩": "love hotel",
- "🏪": "convenience store",
- "🏫": "school",
- "🏬": "department store",
- "🏭": "factory",
- "🏯": "Japanese castle",
- "🏰": "castle",
- "💒": "wedding",
- "🗼": "Tokyo tower",
- "🗽": "Statue of Liberty",
- "⛪": "church",
- "🕌": "mosque",
- "🛕": "hindu temple",
- "🕍": "synagogue",
- "⛩": "shinto shrine",
- "🕋": "kaaba",
- "⛲": "fountain",
- "⛺": "tent",
- "🌁": "foggy",
- "🌃": "night with stars",
- "🏙": "cityscape",
- "🌄": "sunrise over mountains",
- "🌅": "sunrise",
- "🌆": "cityscape at dusk",
- "🌇": "sunset",
- "🌉": "bridge at night",
- "♨": "hot springs",
- "🎠": "carousel horse",
- "🛝": "playground slide",
- "🎡": "ferris wheel",
- "🎢": "roller coaster",
- "💈": "barber pole",
- "🎪": "circus tent",
- "🚂": "locomotive",
- "🚃": "railway car",
- "🚄": "high-speed train",
- "🚅": "bullet train",
- "🚆": "train",
- "🚇": "metro",
- "🚈": "light rail",
- "🚉": "station",
- "🚊": "tram",
- "🚝": "monorail",
- "🚞": "mountain railway",
- "🚋": "tram car",
- "🚌": "bus",
- "🚍": "oncoming bus",
- "🚎": "trolleybus",
- "🚐": "minibus",
- "🚑": "ambulance",
- "🚒": "fire engine",
- "🚓": "police car",
- "🚔": "oncoming police car",
- "🚕": "taxi",
- "🚖": "oncoming taxi",
- "🚗": "automobile",
- "🚘": "oncoming automobile",
- "🚙": "sport utility vehicle",
- "🛻": "pickup truck",
- "🚚": "delivery truck",
- "🚛": "articulated lorry",
- "🚜": "tractor",
- "🏎": "racing car",
- "🏍": "motorcycle",
- "🛵": "motor scooter",
- "🦽": "manual wheelchair",
- "🦼": "motorized wheelchair",
- "🛺": "auto rickshaw",
- "🚲": "bicycle",
- "🛴": "kick scooter",
- "🛹": "skateboard",
- "🛼": "roller skate",
- "🚏": "bus stop",
- "🛣": "motorway",
- "🛤": "railway track",
- "🛢": "oil drum",
- "⛽": "fuel pump",
- "🛞": "wheel",
- "🚨": "police car light",
- "🚥": "horizontal traffic light",
- "🚦": "vertical traffic light",
- "🛑": "stop sign",
- "🚧": "construction",
- "⚓": "anchor",
- "🛟": "ring buoy",
- "⛵": "sailboat",
- "🛶": "canoe",
- "🚤": "speedboat",
- "🛳": "passenger ship",
- "⛴": "ferry",
- "🛥": "motor boat",
- "🚢": "ship",
- "✈": "airplane",
- "🛩": "small airplane",
- "🛫": "airplane departure",
- "🛬": "airplane arrival",
- "🪂": "parachute",
- "💺": "seat",
- "🚁": "helicopter",
- "🚟": "suspension railway",
- "🚠": "mountain cableway",
- "🚡": "aerial tramway",
- "🛰": "satellite",
- "🚀": "rocket",
- "🛸": "flying saucer",
- "🛎": "bellhop bell",
- "🧳": "luggage",
- "⌛": "hourglass done",
- "⏳": "hourglass not done",
- "⌚": "watch",
- "⏰": "alarm clock",
- "⏱": "stopwatch",
- "⏲": "timer clock",
- "🕰": "mantelpiece clock",
- "🕛": "twelve o’clock",
- "🕧": "twelve-thirty",
- "🕐": "one o’clock",
- "🕜": "one-thirty",
- "🕑": "two o’clock",
- "🕝": "two-thirty",
- "🕒": "three o’clock",
- "🕞": "three-thirty",
- "🕓": "four o’clock",
- "🕟": "four-thirty",
- "🕔": "five o’clock",
- "🕠": "five-thirty",
- "🕕": "six o’clock",
- "🕡": "six-thirty",
- "🕖": "seven o’clock",
- "🕢": "seven-thirty",
- "🕗": "eight o’clock",
- "🕣": "eight-thirty",
- "🕘": "nine o’clock",
- "🕤": "nine-thirty",
- "🕙": "ten o’clock",
- "🕥": "ten-thirty",
- "🕚": "eleven o’clock",
- "🕦": "eleven-thirty",
- "🌑": "new moon",
- "🌒": "waxing crescent moon",
- "🌓": "first quarter moon",
- "🌔": "waxing gibbous moon",
- "🌕": "full moon",
- "🌖": "waning gibbous moon",
- "🌗": "last quarter moon",
- "🌘": "waning crescent moon",
- "🌙": "crescent moon",
- "🌚": "new moon face",
- "🌛": "first quarter moon face",
- "🌜": "last quarter moon face",
- "🌡": "thermometer",
- "☀": "sun",
- "🌝": "full moon face",
- "🌞": "sun with face",
- "🪐": "ringed planet",
- "⭐": "star",
- "🌟": "glowing star",
- "🌠": "shooting star",
- "🌌": "milky way",
- "☁": "cloud",
- "⛅": "sun behind cloud",
- "⛈": "cloud with lightning and rain",
- "🌤": "sun behind small cloud",
- "🌥": "sun behind large cloud",
- "🌦": "sun behind rain cloud",
- "🌧": "cloud with rain",
- "🌨": "cloud with snow",
- "🌩": "cloud with lightning",
- "🌪": "tornado",
- "🌫": "fog",
- "🌬": "wind face",
- "🌀": "cyclone",
- "🌈": "rainbow",
- "🌂": "closed umbrella",
- "☂": "umbrella",
- "☔": "umbrella with rain drops",
- "⛱": "umbrella on ground",
- "⚡": "high voltage",
- "❄": "snowflake",
- "☃": "snowman",
- "⛄": "snowman without snow",
- "☄": "comet",
- "🔥": "fire",
- "💧": "droplet",
- "🌊": "water wave",
- "🎃": "jack-o-lantern",
- "🎄": "Christmas tree",
- "🎆": "fireworks",
- "🎇": "sparkler",
- "🧨": "firecracker",
- "✨": "sparkles",
- "🎈": "balloon",
- "🎉": "party popper",
- "🎊": "confetti ball",
- "🎋": "tanabata tree",
- "🎍": "pine decoration",
- "🎎": "Japanese dolls",
- "🎏": "carp streamer",
- "🎐": "wind chime",
- "🎑": "moon viewing ceremony",
- "🧧": "red envelope",
- "🎀": "ribbon",
- "🎁": "wrapped gift",
- "🎗": "reminder ribbon",
- "🎟": "admission tickets",
- "🎫": "ticket",
- "🎖": "military medal",
- "🏆": "trophy",
- "🏅": "sports medal",
- "🥇": "1st place medal",
- "🥈": "2nd place medal",
- "🥉": "3rd place medal",
- "⚽": "soccer ball",
- "⚾": "baseball",
- "🥎": "softball",
- "🏀": "basketball",
- "🏐": "volleyball",
- "🏈": "american football",
- "🏉": "rugby football",
- "🎾": "tennis",
- "🥏": "flying disc",
- "🎳": "bowling",
- "🏏": "cricket game",
- "🏑": "field hockey",
- "🏒": "ice hockey",
- "🥍": "lacrosse",
- "🏓": "ping pong",
- "🏸": "badminton",
- "🥊": "boxing glove",
- "🥋": "martial arts uniform",
- "🥅": "goal net",
- "⛳": "flag in hole",
- "⛸": "ice skate",
- "🎣": "fishing pole",
- "🤿": "diving mask",
- "🎽": "running shirt",
- "🎿": "skis",
- "🛷": "sled",
- "🥌": "curling stone",
- "🎯": "bullseye",
- "🪀": "yo-yo",
- "🪁": "kite",
- "🔫": "water pistol",
- "🎱": "pool 8 ball",
- "🔮": "crystal ball",
- "🪄": "magic wand",
- "🎮": "video game",
- "🕹": "joystick",
- "🎰": "slot machine",
- "🎲": "game die",
- "🧩": "puzzle piece",
- "🧸": "teddy bear",
- "🪅": "piñata",
- "🪩": "mirror ball",
- "🪆": "nesting dolls",
- "♠": "spade suit",
- "♥": "heart suit",
- "♦": "diamond suit",
- "♣": "club suit",
- "♟": "chess pawn",
- "🃏": "joker",
- "🀄": "mahjong red dragon",
- "🎴": "flower playing cards",
- "🎭": "performing arts",
- "🖼": "framed picture",
- "🎨": "artist palette",
- "🧵": "thread",
- "🪡": "sewing needle",
- "🧶": "yarn",
- "🪢": "knot",
- "👓": "glasses",
- "🕶": "sunglasses",
- "🥽": "goggles",
- "🥼": "lab coat",
- "🦺": "safety vest",
- "👔": "necktie",
- "👕": "t-shirt",
- "👖": "jeans",
- "🧣": "scarf",
- "🧤": "gloves",
- "🧥": "coat",
- "🧦": "socks",
- "👗": "dress",
- "👘": "kimono",
- "🥻": "sari",
- "🩱": "one-piece swimsuit",
- "🩲": "briefs",
- "🩳": "shorts",
- "👙": "bikini",
- "👚": "woman’s clothes",
- "🪭": "folding hand fan",
- "👛": "purse",
- "👜": "handbag",
- "👝": "clutch bag",
- "🛍": "shopping bags",
- "🎒": "backpack",
- "🩴": "thong sandal",
- "👞": "man’s shoe",
- "👟": "running shoe",
- "🥾": "hiking boot",
- "🥿": "flat shoe",
- "👠": "high-heeled shoe",
- "👡": "woman’s sandal",
- "🩰": "ballet shoes",
- "👢": "woman’s boot",
- "🪮": "hair pick",
- "👑": "crown",
- "👒": "woman’s hat",
- "🎩": "top hat",
- "🎓": "graduation cap",
- "🧢": "billed cap",
- "🪖": "military helmet",
- "⛑": "rescue worker’s helmet",
- "📿": "prayer beads",
- "💄": "lipstick",
- "💍": "ring",
- "💎": "gem stone",
- "🔇": "muted speaker",
- "🔈": "speaker low volume",
- "🔉": "speaker medium volume",
- "🔊": "speaker high volume",
- "📢": "loudspeaker",
- "📣": "megaphone",
- "📯": "postal horn",
- "🔔": "bell",
- "🔕": "bell with slash",
- "🎼": "musical score",
- "🎵": "musical note",
- "🎶": "musical notes",
- "🎙": "studio microphone",
- "🎚": "level slider",
- "🎛": "control knobs",
- "🎤": "microphone",
- "🎧": "headphone",
- "📻": "radio",
- "🎷": "saxophone",
- "🪗": "accordion",
- "🎸": "guitar",
- "🎹": "musical keyboard",
- "🎺": "trumpet",
- "🎻": "violin",
- "🪕": "banjo",
- "🥁": "drum",
- "🪘": "long drum",
- "🪇": "maracas",
- "🪈": "flute",
- "📱": "mobile phone",
- "📲": "mobile phone with arrow",
- "☎": "telephone",
- "📞": "telephone receiver",
- "📟": "pager",
- "📠": "fax machine",
- "🔋": "battery",
- "🪫": "low battery",
- "🔌": "electric plug",
- "💻": "laptop",
- "🖥": "desktop computer",
- "🖨": "printer",
- "⌨": "keyboard",
- "🖱": "computer mouse",
- "🖲": "trackball",
- "💽": "computer disk",
- "💾": "floppy disk",
- "💿": "optical disk",
- "📀": "dvd",
- "🧮": "abacus",
- "🎥": "movie camera",
- "🎞": "film frames",
- "📽": "film projector",
- "🎬": "clapper board",
- "📺": "television",
- "📷": "camera",
- "📸": "camera with flash",
- "📹": "video camera",
- "📼": "videocassette",
- "🔍": "magnifying glass tilted left",
- "🔎": "magnifying glass tilted right",
- "🕯": "candle",
- "💡": "light bulb",
- "🔦": "flashlight",
- "🏮": "red paper lantern",
- "🪔": "diya lamp",
- "📔": "notebook with decorative cover",
- "📕": "closed book",
- "📖": "open book",
- "📗": "green book",
- "📘": "blue book",
- "📙": "orange book",
- "📚": "books",
- "📓": "notebook",
- "📒": "ledger",
- "📃": "page with curl",
- "📜": "scroll",
- "📄": "page facing up",
- "📰": "newspaper",
- "🗞": "rolled-up newspaper",
- "📑": "bookmark tabs",
- "🔖": "bookmark",
- "🏷": "label",
- "💰": "money bag",
- "🪙": "coin",
- "💴": "yen banknote",
- "💵": "dollar banknote",
- "💶": "euro banknote",
- "💷": "pound banknote",
- "💸": "money with wings",
- "💳": "credit card",
- "🧾": "receipt",
- "💹": "chart increasing with yen",
- "✉": "envelope",
- "📧": "e-mail",
- "📨": "incoming envelope",
- "📩": "envelope with arrow",
- "📤": "outbox tray",
- "📥": "inbox tray",
- "📦": "package",
- "📫": "closed mailbox with raised flag",
- "📪": "closed mailbox with lowered flag",
- "📬": "open mailbox with raised flag",
- "📭": "open mailbox with lowered flag",
- "📮": "postbox",
- "🗳": "ballot box with ballot",
- "✏": "pencil",
- "✒": "black nib",
- "🖋": "fountain pen",
- "🖊": "pen",
- "🖌": "paintbrush",
- "🖍": "crayon",
- "📝": "memo",
- "💼": "briefcase",
- "📁": "file folder",
- "📂": "open file folder",
- "🗂": "card index dividers",
- "📅": "calendar",
- "📆": "tear-off calendar",
- "🗒": "spiral notepad",
- "🗓": "spiral calendar",
- "📇": "card index",
- "📈": "chart increasing",
- "📉": "chart decreasing",
- "📊": "bar chart",
- "📋": "clipboard",
- "📌": "pushpin",
- "📍": "round pushpin",
- "📎": "paperclip",
- "🖇": "linked paperclips",
- "📏": "straight ruler",
- "📐": "triangular ruler",
- "✂": "scissors",
- "🗃": "card file box",
- "🗄": "file cabinet",
- "🗑": "wastebasket",
- "🔒": "locked",
- "🔓": "unlocked",
- "🔏": "locked with pen",
- "🔐": "locked with key",
- "🔑": "key",
- "🗝": "old key",
- "🔨": "hammer",
- "🪓": "axe",
- "⛏": "pick",
- "⚒": "hammer and pick",
- "🛠": "hammer and wrench",
- "🗡": "dagger",
- "⚔": "crossed swords",
- "💣": "bomb",
- "🪃": "boomerang",
- "🏹": "bow and arrow",
- "🛡": "shield",
- "🪚": "carpentry saw",
- "🔧": "wrench",
- "🪛": "screwdriver",
- "🔩": "nut and bolt",
- "⚙": "gear",
- "🗜": "clamp",
- "⚖": "balance scale",
- "🦯": "white cane",
- "🔗": "link",
- "⛓": "chains",
- "🪝": "hook",
- "🧰": "toolbox",
- "🧲": "magnet",
- "🪜": "ladder",
- "⚗": "alembic",
- "🧪": "test tube",
- "🧫": "petri dish",
- "🧬": "dna",
- "🔬": "microscope",
- "🔭": "telescope",
- "📡": "satellite antenna",
- "💉": "syringe",
- "🩸": "drop of blood",
- "💊": "pill",
- "🩹": "adhesive bandage",
- "🩼": "crutch",
- "🩺": "stethoscope",
- "🩻": "x-ray",
- "🚪": "door",
- "🛗": "elevator",
- "🪞": "mirror",
- "🪟": "window",
- "🛏": "bed",
- "🛋": "couch and lamp",
- "🪑": "chair",
- "🚽": "toilet",
- "🪠": "plunger",
- "🚿": "shower",
- "🛁": "bathtub",
- "🪤": "mouse trap",
- "🪒": "razor",
- "🧴": "lotion bottle",
- "🧷": "safety pin",
- "🧹": "broom",
- "🧺": "basket",
- "🧻": "roll of paper",
- "🪣": "bucket",
- "🧼": "soap",
- "🫧": "bubbles",
- "🪥": "toothbrush",
- "🧽": "sponge",
- "🧯": "fire extinguisher",
- "🛒": "shopping cart",
- "🚬": "cigarette",
- "⚰": "coffin",
- "🪦": "headstone",
- "⚱": "funeral urn",
- "🧿": "nazar amulet",
- "🪬": "hamsa",
- "🗿": "moai",
- "🪧": "placard",
- "🪪": "identification card",
- "🏧": "ATM sign",
- "🚮": "litter in bin sign",
- "🚰": "potable water",
- "♿": "wheelchair symbol",
- "🚹": "men’s room",
- "🚺": "women’s room",
- "🚻": "restroom",
- "🚼": "baby symbol",
- "🚾": "water closet",
- "🛂": "passport control",
- "🛃": "customs",
- "🛄": "baggage claim",
- "🛅": "left luggage",
- "⚠": "warning",
- "🚸": "children crossing",
- "⛔": "no entry",
- "🚫": "prohibited",
- "🚳": "no bicycles",
- "🚭": "no smoking",
- "🚯": "no littering",
- "🚱": "non-potable water",
- "🚷": "no pedestrians",
- "📵": "no mobile phones",
- "🔞": "no one under eighteen",
- "☢": "radioactive",
- "☣": "biohazard",
- "⬆": "up arrow",
- "↗": "up-right arrow",
- "➡": "right arrow",
- "↘": "down-right arrow",
- "⬇": "down arrow",
- "↙": "down-left arrow",
- "⬅": "left arrow",
- "↖": "up-left arrow",
- "↕": "up-down arrow",
- "↔": "left-right arrow",
- "↩": "right arrow curving left",
- "↪": "left arrow curving right",
- "⤴": "right arrow curving up",
- "⤵": "right arrow curving down",
- "🔃": "clockwise vertical arrows",
- "🔄": "counterclockwise arrows button",
- "🔙": "BACK arrow",
- "🔚": "END arrow",
- "🔛": "ON! arrow",
- "🔜": "SOON arrow",
- "🔝": "TOP arrow",
- "🛐": "place of worship",
- "⚛": "atom symbol",
- "🕉": "om",
- "✡": "star of David",
- "☸": "wheel of dharma",
- "☯": "yin yang",
- "✝": "latin cross",
- "☦": "orthodox cross",
- "☪": "star and crescent",
- "☮": "peace symbol",
- "🕎": "menorah",
- "🔯": "dotted six-pointed star",
- "🪯": "khanda",
- "♈": "Aries",
- "♉": "Taurus",
- "♊": "Gemini",
- "♋": "Cancer",
- "♌": "Leo",
- "♍": "Virgo",
- "♎": "Libra",
- "♏": "Scorpio",
- "♐": "Sagittarius",
- "♑": "Capricorn",
- "♒": "Aquarius",
- "♓": "Pisces",
- "⛎": "Ophiuchus",
- "🔀": "shuffle tracks button",
- "🔁": "repeat button",
- "🔂": "repeat single button",
- "▶": "play button",
- "⏩": "fast-forward button",
- "⏭": "next track button",
- "⏯": "play or pause button",
- "◀": "reverse button",
- "⏪": "fast reverse button",
- "⏮": "last track button",
- "🔼": "upwards button",
- "⏫": "fast up button",
- "🔽": "downwards button",
- "⏬": "fast down button",
- "⏸": "pause button",
- "⏹": "stop button",
- "⏺": "record button",
- "⏏": "eject button",
- "🎦": "cinema",
- "🔅": "dim button",
- "🔆": "bright button",
- "📶": "antenna bars",
- "🛜": "wireless",
- "📳": "vibration mode",
- "📴": "mobile phone off",
- "♀": "female sign",
- "♂": "male sign",
- "⚧": "transgender symbol",
- "✖": "multiply",
- "➕": "plus",
- "➖": "minus",
- "➗": "divide",
- "🟰": "heavy equals sign",
- "♾": "infinity",
- "‼": "double exclamation mark",
- "⁉": "exclamation question mark",
- "❓": "red question mark",
- "❔": "white question mark",
- "❕": "white exclamation mark",
- "❗": "red exclamation mark",
- "〰": "wavy dash",
- "💱": "currency exchange",
- "💲": "heavy dollar sign",
- "⚕": "medical symbol",
- "♻": "recycling symbol",
- "⚜": "fleur-de-lis",
- "🔱": "trident emblem",
- "📛": "name badge",
- "🔰": "Japanese symbol for beginner",
- "⭕": "hollow red circle",
- "✅": "check mark button",
- "☑": "check box with check",
- "✔": "check mark",
- "❌": "cross mark",
- "❎": "cross mark button",
- "➰": "curly loop",
- "➿": "double curly loop",
- "〽": "part alternation mark",
- "✳": "eight-spoked asterisk",
- "✴": "eight-pointed star",
- "❇": "sparkle",
- "©": "copyright",
- "®": "registered",
- "™": "trade mark",
- "#⃣": "keycap: #",
- "*⃣": "keycap: *",
- "0⃣": "keycap: 0",
- "1⃣": "keycap: 1",
- "2⃣": "keycap: 2",
- "3⃣": "keycap: 3",
- "4⃣": "keycap: 4",
- "5⃣": "keycap: 5",
- "6⃣": "keycap: 6",
- "7⃣": "keycap: 7",
- "8⃣": "keycap: 8",
- "9⃣": "keycap: 9",
- "🔟": "keycap: 10",
- "🔠": "input latin uppercase",
- "🔡": "input latin lowercase",
- "🔢": "input numbers",
- "🔣": "input symbols",
- "🔤": "input latin letters",
- "🅰": "A button (blood type)",
- "🆎": "AB button (blood type)",
- "🅱": "B button (blood type)",
- "🆑": "CL button",
- "🆒": "COOL button",
- "🆓": "FREE button",
- "ℹ": "information",
- "🆔": "ID button",
- "Ⓜ": "circled M",
- "🆕": "NEW button",
- "🆖": "NG button",
- "🅾": "O button (blood type)",
- "🆗": "OK button",
- "🅿": "P button",
- "🆘": "SOS button",
- "🆙": "UP! button",
- "🆚": "VS button",
- "🈁": "Japanese “here” button",
- "🈂": "Japanese “service charge” button",
- "🈷": "Japanese “monthly amount” button",
- "🈶": "Japanese “not free of charge” button",
- "🈯": "Japanese “reserved” button",
- "🉐": "Japanese “bargain” button",
- "🈹": "Japanese “discount” button",
- "🈚": "Japanese “free of charge” button",
- "🈲": "Japanese “prohibited” button",
- "🉑": "Japanese “acceptable” button",
- "🈸": "Japanese “application” button",
- "🈴": "Japanese “passing grade” button",
- "🈳": "Japanese “vacancy” button",
- "㊗": "Japanese “congratulations” button",
- "㊙": "Japanese “secret” button",
- "🈺": "Japanese “open for business” button",
- "🈵": "Japanese “no vacancy” button",
- "🔴": "red circle",
- "🟠": "orange circle",
- "🟡": "yellow circle",
- "🟢": "green circle",
- "🔵": "blue circle",
- "🟣": "purple circle",
- "🟤": "brown circle",
- "⚫": "black circle",
- "⚪": "white circle",
- "🟥": "red square",
- "🟧": "orange square",
- "🟨": "yellow square",
- "🟩": "green square",
- "🟦": "blue square",
- "🟪": "purple square",
- "🟫": "brown square",
- "⬛": "black large square",
- "⬜": "white large square",
- "◼": "black medium square",
- "◻": "white medium square",
- "◾": "black medium-small square",
- "◽": "white medium-small square",
- "▪": "black small square",
- "▫": "white small square",
- "🔶": "large orange diamond",
- "🔷": "large blue diamond",
- "🔸": "small orange diamond",
- "🔹": "small blue diamond",
- "🔺": "red triangle pointed up",
- "🔻": "red triangle pointed down",
- "💠": "diamond with a dot",
- "🔘": "radio button",
- "🔳": "white square button",
- "🔲": "black square button",
- "🏁": "chequered flag",
- "🚩": "triangular flag",
- "🎌": "crossed flags",
- "🏴": "black flag",
- "🏳": "white flag",
- "🏳🌈": "rainbow flag",
- "🏳⚧": "transgender flag",
- "🏴☠": "pirate flag",
- "🇦🇨": "flag: Ascension Island",
- "🇦🇩": "flag: Andorra",
- "🇦🇪": "flag: United Arab Emirates",
- "🇦🇫": "flag: Afghanistan",
- "🇦🇬": "flag: Antigua & Barbuda",
- "🇦🇮": "flag: Anguilla",
- "🇦🇱": "flag: Albania",
- "🇦🇲": "flag: Armenia",
- "🇦🇴": "flag: Angola",
- "🇦🇶": "flag: Antarctica",
- "🇦🇷": "flag: Argentina",
- "🇦🇸": "flag: American Samoa",
- "🇦🇹": "flag: Austria",
- "🇦🇺": "flag: Australia",
- "🇦🇼": "flag: Aruba",
- "🇦🇽": "flag: Åland Islands",
- "🇦🇿": "flag: Azerbaijan",
- "🇧🇦": "flag: Bosnia & Herzegovina",
- "🇧🇧": "flag: Barbados",
- "🇧🇩": "flag: Bangladesh",
- "🇧🇪": "flag: Belgium",
- "🇧🇫": "flag: Burkina Faso",
- "🇧🇬": "flag: Bulgaria",
- "🇧🇭": "flag: Bahrain",
- "🇧🇮": "flag: Burundi",
- "🇧🇯": "flag: Benin",
- "🇧🇱": "flag: St. Barthélemy",
- "🇧🇲": "flag: Bermuda",
- "🇧🇳": "flag: Brunei",
- "🇧🇴": "flag: Bolivia",
- "🇧🇶": "flag: Caribbean Netherlands",
- "🇧🇷": "flag: Brazil",
- "🇧🇸": "flag: Bahamas",
- "🇧🇹": "flag: Bhutan",
- "🇧🇻": "flag: Bouvet Island",
- "🇧🇼": "flag: Botswana",
- "🇧🇾": "flag: Belarus",
- "🇧🇿": "flag: Belize",
- "🇨🇦": "flag: Canada",
- "🇨🇨": "flag: Cocos (Keeling) Islands",
- "🇨🇩": "flag: Congo - Kinshasa",
- "🇨🇫": "flag: Central African Republic",
- "🇨🇬": "flag: Congo - Brazzaville",
- "🇨🇭": "flag: Switzerland",
- "🇨🇮": "flag: Côte d’Ivoire",
- "🇨🇰": "flag: Cook Islands",
- "🇨🇱": "flag: Chile",
- "🇨🇲": "flag: Cameroon",
- "🇨🇳": "flag: China",
- "🇨🇴": "flag: Colombia",
- "🇨🇵": "flag: Clipperton Island",
- "🇨🇷": "flag: Costa Rica",
- "🇨🇺": "flag: Cuba",
- "🇨🇻": "flag: Cape Verde",
- "🇨🇼": "flag: Curaçao",
- "🇨🇽": "flag: Christmas Island",
- "🇨🇾": "flag: Cyprus",
- "🇨🇿": "flag: Czechia",
- "🇩🇪": "flag: Germany",
- "🇩🇬": "flag: Diego Garcia",
- "🇩🇯": "flag: Djibouti",
- "🇩🇰": "flag: Denmark",
- "🇩🇲": "flag: Dominica",
- "🇩🇴": "flag: Dominican Republic",
- "🇩🇿": "flag: Algeria",
- "🇪🇦": "flag: Ceuta & Melilla",
- "🇪🇨": "flag: Ecuador",
- "🇪🇪": "flag: Estonia",
- "🇪🇬": "flag: Egypt",
- "🇪🇭": "flag: Western Sahara",
- "🇪🇷": "flag: Eritrea",
- "🇪🇸": "flag: Spain",
- "🇪🇹": "flag: Ethiopia",
- "🇪🇺": "flag: European Union",
- "🇫🇮": "flag: Finland",
- "🇫🇯": "flag: Fiji",
- "🇫🇰": "flag: Falkland Islands",
- "🇫🇲": "flag: Micronesia",
- "🇫🇴": "flag: Faroe Islands",
- "🇫🇷": "flag: France",
- "🇬🇦": "flag: Gabon",
- "🇬🇧": "flag: United Kingdom",
- "🇬🇩": "flag: Grenada",
- "🇬🇪": "flag: Georgia",
- "🇬🇫": "flag: French Guiana",
- "🇬🇬": "flag: Guernsey",
- "🇬🇭": "flag: Ghana",
- "🇬🇮": "flag: Gibraltar",
- "🇬🇱": "flag: Greenland",
- "🇬🇲": "flag: Gambia",
- "🇬🇳": "flag: Guinea",
- "🇬🇵": "flag: Guadeloupe",
- "🇬🇶": "flag: Equatorial Guinea",
- "🇬🇷": "flag: Greece",
- "🇬🇸": "flag: South Georgia & South Sandwich Islands",
- "🇬🇹": "flag: Guatemala",
- "🇬🇺": "flag: Guam",
- "🇬🇼": "flag: Guinea-Bissau",
- "🇬🇾": "flag: Guyana",
- "🇭🇰": "flag: Hong Kong SAR China",
- "🇭🇲": "flag: Heard & McDonald Islands",
- "🇭🇳": "flag: Honduras",
- "🇭🇷": "flag: Croatia",
- "🇭🇹": "flag: Haiti",
- "🇭🇺": "flag: Hungary",
- "🇮🇨": "flag: Canary Islands",
- "🇮🇩": "flag: Indonesia",
- "🇮🇪": "flag: Ireland",
- "🇮🇱": "flag: Israel",
- "🇮🇲": "flag: Isle of Man",
- "🇮🇳": "flag: India",
- "🇮🇴": "flag: British Indian Ocean Territory",
- "🇮🇶": "flag: Iraq",
- "🇮🇷": "flag: Iran",
- "🇮🇸": "flag: Iceland",
- "🇮🇹": "flag: Italy",
- "🇯🇪": "flag: Jersey",
- "🇯🇲": "flag: Jamaica",
- "🇯🇴": "flag: Jordan",
- "🇯🇵": "flag: Japan",
- "🇰🇪": "flag: Kenya",
- "🇰🇬": "flag: Kyrgyzstan",
- "🇰🇭": "flag: Cambodia",
- "🇰🇮": "flag: Kiribati",
- "🇰🇲": "flag: Comoros",
- "🇰🇳": "flag: St. Kitts & Nevis",
- "🇰🇵": "flag: North Korea",
- "🇰🇷": "flag: South Korea",
- "🇰🇼": "flag: Kuwait",
- "🇰🇾": "flag: Cayman Islands",
- "🇰🇿": "flag: Kazakhstan",
- "🇱🇦": "flag: Laos",
- "🇱🇧": "flag: Lebanon",
- "🇱🇨": "flag: St. Lucia",
- "🇱🇮": "flag: Liechtenstein",
- "🇱🇰": "flag: Sri Lanka",
- "🇱🇷": "flag: Liberia",
- "🇱🇸": "flag: Lesotho",
- "🇱🇹": "flag: Lithuania",
- "🇱🇺": "flag: Luxembourg",
- "🇱🇻": "flag: Latvia",
- "🇱🇾": "flag: Libya",
- "🇲🇦": "flag: Morocco",
- "🇲🇨": "flag: Monaco",
- "🇲🇩": "flag: Moldova",
- "🇲🇪": "flag: Montenegro",
- "🇲🇫": "flag: St. Martin",
- "🇲🇬": "flag: Madagascar",
- "🇲🇭": "flag: Marshall Islands",
- "🇲🇰": "flag: North Macedonia",
- "🇲🇱": "flag: Mali",
- "🇲🇲": "flag: Myanmar (Burma)",
- "🇲🇳": "flag: Mongolia",
- "🇲🇴": "flag: Macao SAR China",
- "🇲🇵": "flag: Northern Mariana Islands",
- "🇲🇶": "flag: Martinique",
- "🇲🇷": "flag: Mauritania",
- "🇲🇸": "flag: Montserrat",
- "🇲🇹": "flag: Malta",
- "🇲🇺": "flag: Mauritius",
- "🇲🇻": "flag: Maldives",
- "🇲🇼": "flag: Malawi",
- "🇲🇽": "flag: Mexico",
- "🇲🇾": "flag: Malaysia",
- "🇲🇿": "flag: Mozambique",
- "🇳🇦": "flag: Namibia",
- "🇳🇨": "flag: New Caledonia",
- "🇳🇪": "flag: Niger",
- "🇳🇫": "flag: Norfolk Island",
- "🇳🇬": "flag: Nigeria",
- "🇳🇮": "flag: Nicaragua",
- "🇳🇱": "flag: Netherlands",
- "🇳🇴": "flag: Norway",
- "🇳🇵": "flag: Nepal",
- "🇳🇷": "flag: Nauru",
- "🇳🇺": "flag: Niue",
- "🇳🇿": "flag: New Zealand",
- "🇴🇲": "flag: Oman",
- "🇵🇦": "flag: Panama",
- "🇵🇪": "flag: Peru",
- "🇵🇫": "flag: French Polynesia",
- "🇵🇬": "flag: Papua New Guinea",
- "🇵🇭": "flag: Philippines",
- "🇵🇰": "flag: Pakistan",
- "🇵🇱": "flag: Poland",
- "🇵🇲": "flag: St. Pierre & Miquelon",
- "🇵🇳": "flag: Pitcairn Islands",
- "🇵🇷": "flag: Puerto Rico",
- "🇵🇸": "flag: Palestinian Territories",
- "🇵🇹": "flag: Portugal",
- "🇵🇼": "flag: Palau",
- "🇵🇾": "flag: Paraguay",
- "🇶🇦": "flag: Qatar",
- "🇷🇪": "flag: Réunion",
- "🇷🇴": "flag: Romania",
- "🇷🇸": "flag: Serbia",
- "🇷🇺": "flag: Russia",
- "🇷🇼": "flag: Rwanda",
- "🇸🇦": "flag: Saudi Arabia",
- "🇸🇧": "flag: Solomon Islands",
- "🇸🇨": "flag: Seychelles",
- "🇸🇩": "flag: Sudan",
- "🇸🇪": "flag: Sweden",
- "🇸🇬": "flag: Singapore",
- "🇸🇭": "flag: St. Helena",
- "🇸🇮": "flag: Slovenia",
- "🇸🇯": "flag: Svalbard & Jan Mayen",
- "🇸🇰": "flag: Slovakia",
- "🇸🇱": "flag: Sierra Leone",
- "🇸🇲": "flag: San Marino",
- "🇸🇳": "flag: Senegal",
- "🇸🇴": "flag: Somalia",
- "🇸🇷": "flag: Suriname",
- "🇸🇸": "flag: South Sudan",
- "🇸🇹": "flag: São Tomé & Príncipe",
- "🇸🇻": "flag: El Salvador",
- "🇸🇽": "flag: Sint Maarten",
- "🇸🇾": "flag: Syria",
- "🇸🇿": "flag: Eswatini",
- "🇹🇦": "flag: Tristan da Cunha",
- "🇹🇨": "flag: Turks & Caicos Islands",
- "🇹🇩": "flag: Chad",
- "🇹🇫": "flag: French Southern Territories",
- "🇹🇬": "flag: Togo",
- "🇹🇭": "flag: Thailand",
- "🇹🇯": "flag: Tajikistan",
- "🇹🇰": "flag: Tokelau",
- "🇹🇱": "flag: Timor-Leste",
- "🇹🇲": "flag: Turkmenistan",
- "🇹🇳": "flag: Tunisia",
- "🇹🇴": "flag: Tonga",
- "🇹🇷": "flag: Turkey",
- "🇹🇹": "flag: Trinidad & Tobago",
- "🇹🇻": "flag: Tuvalu",
- "🇹🇼": "flag: Taiwan",
- "🇹🇿": "flag: Tanzania",
- "🇺🇦": "flag: Ukraine",
- "🇺🇬": "flag: Uganda",
- "🇺🇲": "flag: U.S. Outlying Islands",
- "🇺🇳": "flag: United Nations",
- "🇺🇸": "flag: United States",
- "🇺🇾": "flag: Uruguay",
- "🇺🇿": "flag: Uzbekistan",
- "🇻🇦": "flag: Vatican City",
- "🇻🇨": "flag: St. Vincent & Grenadines",
- "🇻🇪": "flag: Venezuela",
- "🇻🇬": "flag: British Virgin Islands",
- "🇻🇮": "flag: U.S. Virgin Islands",
- "🇻🇳": "flag: Vietnam",
- "🇻🇺": "flag: Vanuatu",
- "🇼🇫": "flag: Wallis & Futuna",
- "🇼🇸": "flag: Samoa",
- "🇽🇰": "flag: Kosovo",
- "🇾🇪": "flag: Yemen",
- "🇾🇹": "flag: Mayotte",
- "🇿🇦": "flag: South Africa",
- "🇿🇲": "flag: Zambia",
- "🇿🇼": "flag: Zimbabwe",
- "🏴": "flag: England",
- "🏴": "flag: Scotland",
- "🏴": "flag: Wales"
-}
diff --git a/client/js/helpers/ircmessageparser/anyIntersection.ts b/client/js/helpers/ircmessageparser/anyIntersection.ts
deleted file mode 100644
index cf2fd156..00000000
--- a/client/js/helpers/ircmessageparser/anyIntersection.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-// Return true if any section of "a" or "b" parts (defined by their start/end
-
-import {Part} from "./merge";
-
-// markers) intersect each other, false otherwise.
-function anyIntersection(a: Part, b: Part) {
- return (
- (a.start <= b.start && b.start < a.end) ||
- (a.start < b.end && b.end <= a.end) ||
- (b.start <= a.start && a.start < b.end) ||
- (b.start < a.end && a.end <= b.end)
- );
-}
-
-export default anyIntersection;
diff --git a/client/js/helpers/ircmessageparser/fill.ts b/client/js/helpers/ircmessageparser/fill.ts
deleted file mode 100644
index c9e613f1..00000000
--- a/client/js/helpers/ircmessageparser/fill.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-// Create plain text entries corresponding to areas of the text that match no
-// existing entries. Returns an empty array if all parts of the text have been
-
-import {Part} from "./merge";
-
-// parsed into recognizable entries already.
-function fill(existingEntries: Part[], text: string) {
- let position = 0;
-
- // Fill inner parts of the text. For example, if text is `foobarbaz` and both
- // `foo` and `baz` have matched into an entry, this will return a dummy entry
- // corresponding to `bar`.
- const result = existingEntries.reduce((acc, textSegment) => {
- if (textSegment.start > position) {
- acc.push({
- start: position,
- end: textSegment.start,
- });
- }
-
- position = textSegment.end;
- return acc;
- }, []);
-
- // Complete the unmatched end of the text with a dummy entry
- if (position < text.length) {
- result.push({
- start: position,
- end: text.length,
- });
- }
-
- return result;
-}
-
-export default fill;
diff --git a/client/js/helpers/ircmessageparser/findChannels.ts b/client/js/helpers/ircmessageparser/findChannels.ts
deleted file mode 100644
index f55ea586..00000000
--- a/client/js/helpers/ircmessageparser/findChannels.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-// Escapes the RegExp special characters "^", "$", "", ".", "*", "+", "?", "(",
-// ")", "[", "]", "{", "}", and "|" in string.
-// See https://lodash.com/docs/#escapeRegExp
-import escapeRegExp from "lodash/escapeRegExp";
-import {Part} from "./merge";
-
-export type ChannelPart = Part & {
- channel: string;
-};
-
-// escapes a regex in a way that's compatible to shove it in
-// a regex char set (meaning it also escapes -)
-function escapeRegExpCharSet(raw: string): string {
- const escaped: string = escapeRegExp(raw);
- return escaped.replace("-", "\\-");
-}
-
-// Given an array of channel prefixes (such as "#" and "&") and an array of user
-// modes (such as "@" and "+"), this function extracts channels and nicks from a
-// text.
-// It returns an array of objects for each channel found with their start index,
-// end index and channel name.
-function findChannels(text: string, channelPrefixes: string[], userModes: string[]) {
- // `userModePattern` is necessary to ignore user modes in /whois responses.
- // For example, a voiced user in #thelounge will have a /whois response of:
- // > foo is on the following channels: +#thelounge
- // We need to explicitly ignore user modes to parse such channels correctly.
- const userModePattern = userModes.map(escapeRegExpCharSet).join("");
- const channelPrefixPattern = channelPrefixes.map(escapeRegExpCharSet).join("");
- const channelPattern = `(?:^|\\s)[${userModePattern}]*([${channelPrefixPattern}][^ \u0007]+)`;
- const channelRegExp = new RegExp(channelPattern, "g");
-
- const result: ChannelPart[] = [];
- let match: RegExpExecArray | null;
-
- do {
- // With global ("g") regexes, calling `exec` multiple times will find
- // successive matches in the same string.
- match = channelRegExp.exec(text);
-
- if (match) {
- result.push({
- start: match.index + match[0].length - match[1].length,
- end: match.index + match[0].length,
- channel: match[1],
- });
- }
- } while (match);
-
- return result;
-}
-
-export default findChannels;
diff --git a/client/js/helpers/ircmessageparser/findEmoji.ts b/client/js/helpers/ircmessageparser/findEmoji.ts
deleted file mode 100644
index 7ebc95cc..00000000
--- a/client/js/helpers/ircmessageparser/findEmoji.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import emojiRegExp from "emoji-regex";
-import {Part} from "./merge";
-
-const regExp = emojiRegExp();
-
-export type EmojiPart = Part & {
- emoji: string;
-};
-
-function findEmoji(text: string) {
- const result: EmojiPart[] = [];
- let match: RegExpExecArray | null;
-
- while ((match = regExp.exec(text))) {
- result.push({
- start: match.index,
- end: match.index + match[0].length,
- emoji: match[0],
- });
- }
-
- return result;
-}
-
-export default findEmoji;
diff --git a/client/js/helpers/ircmessageparser/findNames.ts b/client/js/helpers/ircmessageparser/findNames.ts
deleted file mode 100644
index 52b116e3..00000000
--- a/client/js/helpers/ircmessageparser/findNames.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import {Part} from "./merge";
-
-const nickRegExp = /([\w[\]\\`^{|}-]+)/g;
-
-export type NamePart = Part & {
- nick: string;
-};
-
-function findNames(text: string, nicks: string[]): NamePart[] {
- const result: NamePart[] = [];
-
- // Return early if we don't have any nicknames to find
- if (nicks.length === 0) {
- return result;
- }
-
- let match: RegExpExecArray | null;
-
- while ((match = nickRegExp.exec(text))) {
- if (nicks.indexOf(match[1]) > -1) {
- result.push({
- start: match.index,
- end: match.index + match[1].length,
- nick: match[1],
- });
- }
- }
-
- return result;
-}
-
-export default findNames;
diff --git a/client/js/helpers/ircmessageparser/merge.ts b/client/js/helpers/ircmessageparser/merge.ts
deleted file mode 100644
index 707c495d..00000000
--- a/client/js/helpers/ircmessageparser/merge.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-import anyIntersection from "./anyIntersection";
-import fill from "./fill";
-import {ChannelPart} from "./findChannels";
-import {EmojiPart} from "./findEmoji";
-import {LinkPart} from "../../../../shared/linkify";
-import {NamePart} from "./findNames";
-
-export type Part = {
- start: number;
- end: number;
-};
-
-type TextPart = Part & {
- text: string;
-};
-
-type Fragment = {
- start: number;
- end: number;
- text: string;
-};
-
-type PartWithFragments = Part & {
- fragments: Fragment[];
-};
-
-// Merge text part information within a styling fragment
-function assign(textPart: Part, fragment: Fragment) {
- const fragStart = fragment.start;
- const start = Math.max(fragment.start, textPart.start);
- const end = Math.min(fragment.end, textPart.end);
- const text = fragment.text.slice(start - fragStart, end - fragStart);
-
- return Object.assign({}, fragment, {start, end, text});
-}
-
-function sortParts(a: Part, b: Part) {
- return a.start - b.start || b.end - a.end;
-}
-
-export type MergedParts = (TextPart | NamePart | EmojiPart | ChannelPart | LinkPart)[];
-
-// Merge the style fragments within the text parts, taking into account
-// boundaries and text sections that have not matched to links or channels.
-// For example, given a string "foobar" where "foo" and "bar" have been
-// identified as parts (channels, links, etc.) and "fo", "ob" and "ar" have 3
-// different styles, the first resulting part will contain fragments "fo" and
-// "o", and the second resulting part will contain "b" and "ar". "o" and "b"
-// fragments will contain duplicate styling attributes.
-function merge(
- parts: MergedParts,
- styleFragments: Fragment[],
- cleanText: string
-): PartWithFragments[] {
- // Remove overlapping parts
- parts = parts.sort(sortParts).reduce((prev, curr) => {
- const intersection = prev.some((p) => anyIntersection(p, curr));
-
- if (intersection) {
- return prev;
- }
-
- return prev.concat([curr]);
- }, []);
-
- // Every section of the original text that has not been captured in a "part"
- // is filled with "text" parts, dummy objects with start/end but no extra
- // metadata.
-
- const filled = fill(parts, cleanText) as TextPart[];
- const allParts: MergedParts = [...parts, ...filled].sort(sortParts); // Sort all parts identified based on their position in the original text
-
- // Distribute the style fragments within the text parts
- return allParts.map((part: any) => {
- part.fragments = styleFragments
- .filter((fragment) => anyIntersection(part, fragment))
- .map((fragment) => assign(part, fragment));
-
- return part as PartWithFragments;
- });
-}
-
-export default merge;
diff --git a/client/js/helpers/ircmessageparser/parseStyle.ts b/client/js/helpers/ircmessageparser/parseStyle.ts
deleted file mode 100644
index ea4d4bd3..00000000
--- a/client/js/helpers/ircmessageparser/parseStyle.ts
+++ /dev/null
@@ -1,250 +0,0 @@
-// Styling control codes
-const BOLD = "\x02";
-const COLOR = "\x03";
-const HEX_COLOR = "\x04";
-const RESET = "\x0f";
-const REVERSE = "\x16";
-const ITALIC = "\x1d";
-const UNDERLINE = "\x1f";
-const STRIKETHROUGH = "\x1e";
-const MONOSPACE = "\x11";
-
-export type ParsedStyle = {
- bold?: boolean;
- textColor?: string;
- bgColor?: string;
- hexColor?: string;
- hexBgColor?: string;
- italic?: boolean;
- underline?: boolean;
- strikethrough?: boolean;
- monospace?: boolean;
- text: string;
- start: number;
- end: number;
-};
-
-// Color code matcher, with format `XX,YY` where both `XX` and `YY` are
-// integers, `XX` is the text color and `YY` is an optional background color.
-const colorRx = /^(\d{1,2})(?:,(\d{1,2}))?/;
-
-// 6-char Hex color code matcher
-const hexColorRx = /^([0-9a-f]{6})(?:,([0-9a-f]{6}))?/i;
-
-// Represents all other control codes that to be ignored/filtered from the text
-// This regex allows line feed character
-const controlCodesRx = /[\u0000-\u0009\u000B-\u001F]/g;
-
-// Converts a given text into an array of objects, each of them representing a
-// similarly styled section of the text. Each object carries the `text`, style
-// information (`bold`, `textColor`, `bgcolor`, `italic`,
-// `underline`, `strikethrough`, `monospace`), and `start`/`end` cursors.
-function parseStyle(text: string) {
- const result: ParsedStyle[] = [];
- let start = 0;
- let position = 0;
-
- // At any given time, these carry style information since last time a styling
- // control code was met.
- let colorCodes,
- bold,
- textColor,
- bgColor,
- hexColor,
- hexBgColor,
- italic,
- underline,
- strikethrough,
- monospace;
-
- const resetStyle = () => {
- bold = false;
- textColor = undefined;
- bgColor = undefined;
- hexColor = undefined;
- hexBgColor = undefined;
- italic = false;
- underline = false;
- strikethrough = false;
- monospace = false;
- };
-
- resetStyle();
-
- // When called, this "closes" the current fragment by adding an entry to the
- // `result` array using the styling information set last time a control code
- // was met.
- const emitFragment = () => {
- // Uses the text fragment starting from the last control code position up to
- // the current position
- const textPart = text.slice(start, position);
-
- // Filters out all non-style related control codes present in this text
- const processedText = textPart.replace(controlCodesRx, " ");
-
- if (processedText.length) {
- // Current fragment starts where the previous one ends, or at 0 if none
- const fragmentStart = result.length ? result[result.length - 1].end : 0;
-
- result.push({
- bold,
- textColor,
- bgColor,
- hexColor,
- hexBgColor,
- italic,
- underline,
- strikethrough,
- monospace,
- text: processedText,
- start: fragmentStart,
- end: fragmentStart + processedText.length,
- });
- }
-
- // Now that a fragment has been "closed", the next one will start after that
- start = position + 1;
- };
-
- // This loop goes through each character of the given text one by one by
- // bumping the `position` cursor. Every time a new special "styling" character
- // is met, an object gets created (with `emitFragment()`)information on text
- // encountered since the previous styling character.
- while (position < text.length) {
- switch (text[position]) {
- case RESET:
- emitFragment();
- resetStyle();
- break;
-
- // Meeting a BOLD character means that the ongoing text is either going to
- // be in bold or that the previous one was in bold and the following one
- // must be reset.
- // This same behavior applies to COLOR, REVERSE, ITALIC, and UNDERLINE.
- case BOLD:
- emitFragment();
- bold = !bold;
- break;
-
- case COLOR:
- emitFragment();
-
- // Go one step further to find the corresponding color
- colorCodes = text.slice(position + 1).match(colorRx);
-
- if (colorCodes) {
- textColor = Number(colorCodes[1]);
-
- if (colorCodes[2]) {
- bgColor = Number(colorCodes[2]);
- }
-
- // Color code length is > 1, so bump the current position cursor by as
- // much (and reset the start cursor for the current text block as well)
- position += colorCodes[0].length;
- start = position + 1;
- } else {
- // If no color codes were found, toggles back to no colors (like BOLD).
- textColor = undefined;
- bgColor = undefined;
- }
-
- break;
-
- case HEX_COLOR:
- emitFragment();
-
- colorCodes = text.slice(position + 1).match(hexColorRx);
-
- if (colorCodes) {
- hexColor = colorCodes[1].toUpperCase();
-
- if (colorCodes[2]) {
- hexBgColor = colorCodes[2].toUpperCase();
- }
-
- // Color code length is > 1, so bump the current position cursor by as
- // much (and reset the start cursor for the current text block as well)
- position += colorCodes[0].length;
- start = position + 1;
- } else {
- // If no color codes were found, toggles back to no colors (like BOLD).
- hexColor = undefined;
- hexBgColor = undefined;
- }
-
- break;
-
- case REVERSE: {
- emitFragment();
- const tmp = bgColor;
- bgColor = textColor;
- textColor = tmp;
- break;
- }
-
- case ITALIC:
- emitFragment();
- italic = !italic;
- break;
-
- case UNDERLINE:
- emitFragment();
- underline = !underline;
- break;
-
- case STRIKETHROUGH:
- emitFragment();
- strikethrough = !strikethrough;
- break;
-
- case MONOSPACE:
- emitFragment();
- monospace = !monospace;
- break;
- }
-
- // Evaluate the next character at the next iteration
- position += 1;
- }
-
- // The entire text has been parsed, so we finalize the current text fragment.
- emitFragment();
-
- return result;
-}
-
-const properties = [
- "bold",
- "textColor",
- "bgColor",
- "hexColor",
- "hexBgColor",
- "italic",
- "underline",
- "strikethrough",
- "monospace",
-];
-
-function prepare(text: string) {
- return (
- parseStyle(text)
- // This optimizes fragments by combining them together when all their values
- // for the properties defined above are equal.
- .reduce((prev: ParsedStyle[], curr) => {
- if (prev.length) {
- const lastEntry = prev[prev.length - 1];
-
- if (properties.every((key) => curr[key] === lastEntry[key])) {
- lastEntry.text += curr.text;
- lastEntry.end += curr.text.length;
- return prev;
- }
- }
-
- return prev.concat([curr]);
- }, [])
- );
-}
-
-export default prepare;
diff --git a/client/js/helpers/isChannelCollapsed.ts b/client/js/helpers/isChannelCollapsed.ts
deleted file mode 100644
index 59e0b631..00000000
--- a/client/js/helpers/isChannelCollapsed.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import {store} from "../store";
-
-export default (network, channel) => {
- if (!network.isCollapsed || channel.highlight || channel.type === "lobby") {
- return false;
- }
-
- if (store.state.activeChannel && channel === store.state.activeChannel.channel) {
- return false;
- }
-
- return true;
-};
diff --git a/client/js/helpers/isIgnoredKeybind.ts b/client/js/helpers/isIgnoredKeybind.ts
deleted file mode 100644
index 0f0ab513..00000000
--- a/client/js/helpers/isIgnoredKeybind.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-export default (event: MouseEvent | Mousetrap.ExtendedKeyboardEvent) => {
- if (
- (event.target as HTMLElement).tagName !== "TEXTAREA" &&
- (event.target as HTMLElement).tagName !== "INPUT"
- ) {
- return false;
- }
-
- // If focus is in a textarea, do not handle keybinds if user has typed anything
- // This is done to prevent keyboard layout binds conflicting with ours
- // For example alt+shift+left on macos selects a word
- return !!(event.target as any).value;
-};
diff --git a/client/js/helpers/listenForTwoFingerSwipes.ts b/client/js/helpers/listenForTwoFingerSwipes.ts
deleted file mode 100644
index de920e21..00000000
--- a/client/js/helpers/listenForTwoFingerSwipes.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import distance from "./distance";
-
-// onTwoFingerSwipe will be called with a cardinal direction ("n", "e", "s" or
-// "w") as its only argument.
-function listenForTwoFingerSwipes(onTwoFingerSwipe) {
- let history: {
- center: number[];
- timestamp: number;
- }[] = [];
-
- document.body.addEventListener(
- "touchmove",
- function (event) {
- if (event.touches.length !== 2) {
- return;
- }
-
- const a = event.touches.item(0);
- const b = event.touches.item(1);
-
- if (!a || !b) {
- return;
- }
-
- const timestamp = window.performance.now();
- const center = [(a.screenX + b.screenX) / 2, (a.screenY + b.screenY) / 2];
-
- if (history.length > 0) {
- const last = history[history.length - 1];
- const centersAreEqual =
- last.center[0] === center[0] && last.center[1] === center[1];
-
- if (last.timestamp === timestamp || centersAreEqual) {
- // Touches with the same timestamps or center don't help us
- // see the speed of movement. Ignore them.
- return;
- }
- }
-
- history.push({timestamp, center});
- },
- {passive: true}
- );
-
- document.body.addEventListener(
- "touchend",
- function (event) {
- if (event.touches.length >= 2) {
- return;
- }
-
- try {
- const direction = getSwipe(history);
-
- if (direction) {
- onTwoFingerSwipe(direction);
- }
- } finally {
- history = [];
- }
- },
- {passive: true}
- );
-
- document.body.addEventListener(
- "touchcancel",
- function () {
- history = [];
- },
- {passive: true}
- );
-}
-
-// Returns the cardinal direction of the swipe or null if there is no swipe.
-function getSwipe(hist) {
- // Speed is in pixels/millisecond. Must be maintained throughout swipe.
- const MIN_SWIPE_SPEED = 0.2;
-
- if (hist.length < 2) {
- return null;
- }
-
- for (let i = 1; i < hist.length; ++i) {
- const previous = hist[i - 1];
- const current = hist[i];
-
- const speed =
- distance(previous.center, current.center) /
- Math.abs(previous.timestamp - current.timestamp);
-
- if (speed < MIN_SWIPE_SPEED) {
- return null;
- }
- }
-
- return getCardinalDirection(hist[0].center, hist[hist.length - 1].center);
-}
-
-function getCardinalDirection([x1, y1], [x2, y2]) {
- // If θ is the angle of the vector then this is tan(θ)
- const tangent = (y2 - y1) / (x2 - x1);
-
- // All values of |tan(-45° to 45°)| are less than 1, same for 145° to 225°
- if (Math.abs(tangent) < 1) {
- return x1 < x2 ? "e" : "w";
- }
-
- return y1 < y2 ? "s" : "n";
-}
-
-export default listenForTwoFingerSwipes;
diff --git a/client/js/helpers/localetime.ts b/client/js/helpers/localetime.ts
deleted file mode 100644
index 91924f93..00000000
--- a/client/js/helpers/localetime.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import dayjs from "dayjs";
-
-export default (time: Date | number) => dayjs(time).format("D MMMM YYYY, HH:mm:ss");
diff --git a/client/js/helpers/parse.ts b/client/js/helpers/parse.ts
deleted file mode 100644
index 42b71ed4..00000000
--- a/client/js/helpers/parse.ts
+++ /dev/null
@@ -1,220 +0,0 @@
-// TODO: type
-// @ts-nocheck
-
-import {h as createElement, VNode} from "vue";
-import parseStyle from "./ircmessageparser/parseStyle";
-import findChannels from "./ircmessageparser/findChannels";
-import {findLinks} from "../../../shared/linkify";
-import findEmoji from "./ircmessageparser/findEmoji";
-import findNames from "./ircmessageparser/findNames";
-import merge, {MergedParts} from "./ircmessageparser/merge";
-import emojiMap from "./fullnamemap.json";
-import LinkPreviewToggle from "../../components/LinkPreviewToggle.vue";
-import LinkPreviewFileSize from "../../components/LinkPreviewFileSize.vue";
-import InlineChannel from "../../components/InlineChannel.vue";
-import Username from "../../components/Username.vue";
-import {ClientMessage, ClientNetwork} from "../types";
-
-const emojiModifiersRegex = /[\u{1f3fb}-\u{1f3ff}]|\u{fe0f}/gu;
-
-type Fragment = {
- class?: string[];
- text?: string;
-};
-
-type StyledFragment = Fragment & {
- textColor?: string;
- bgColor?: string;
- hexColor?: string;
- hexBgColor?: string;
-
- bold?: boolean;
- italic?: boolean;
- underline?: boolean;
- monospace?: boolean;
- strikethrough?: boolean;
-};
-
-// Create an HTML `span` with styling information for a given fragment
-function createFragment(fragment: StyledFragment): VNode | string | undefined {
- const classes: string[] = [];
-
- if (fragment.bold) {
- classes.push("irc-bold");
- }
-
- if (fragment.textColor !== undefined) {
- classes.push("irc-fg" + fragment.textColor);
- }
-
- if (fragment.bgColor !== undefined) {
- classes.push("irc-bg" + fragment.bgColor);
- }
-
- if (fragment.italic) {
- classes.push("irc-italic");
- }
-
- if (fragment.underline) {
- classes.push("irc-underline");
- }
-
- if (fragment.strikethrough) {
- classes.push("irc-strikethrough");
- }
-
- if (fragment.monospace) {
- classes.push("irc-monospace");
- }
-
- const data: {
- class?: string[];
- style?: Record;
- } = {
- class: undefined,
- style: undefined,
- };
-
- let hasData = false;
-
- if (classes.length > 0) {
- hasData = true;
- data.class = classes;
- }
-
- if (fragment.hexColor) {
- hasData = true;
- data.style = {
- color: `#${fragment.hexColor}`,
- };
-
- if (fragment.hexBgColor) {
- data.style["background-color"] = `#${fragment.hexBgColor}`;
- }
- }
-
- return hasData ? createElement("span", data, fragment.text) : fragment.text;
-}
-
-// Transform an IRC message potentially filled with styling control codes, URLs,
-// nicknames, and channels into a string of HTML elements to display on the client.
-function parse(text: string, message?: ClientMessage, network?: ClientNetwork) {
- // Extract the styling information and get the plain text version from it
- const styleFragments = parseStyle(text);
- const cleanText = styleFragments.map((fragment) => fragment.text).join("");
-
- // On the plain text, find channels and URLs, returned as "parts". Parts are
- // arrays of objects containing start and end markers, as well as metadata
- // depending on what was found (channel or link).
- const channelPrefixes = network ? network.serverOptions.CHANTYPES : ["#", "&"];
- const userModes = network
- ? network.serverOptions.PREFIX?.prefix?.map((pref) => pref.symbol)
- : ["!", "@", "%", "+"];
- const channelParts = findChannels(cleanText, channelPrefixes, userModes);
- const linkParts = findLinks(cleanText);
- const emojiParts = findEmoji(cleanText);
- const nameParts = findNames(cleanText, message ? message.users || [] : []);
-
- const parts = (channelParts as MergedParts)
- .concat(linkParts)
- .concat(emojiParts)
- .concat(nameParts);
-
- // Merge the styling information with the channels / URLs / nicks / text objects and
- // generate HTML strings with the resulting fragments
- return merge(parts, styleFragments, cleanText).map((textPart) => {
- const fragments = textPart.fragments.map((fragment) => createFragment(fragment));
-
- // Wrap these potentially styled fragments with links and channel buttons
- if (textPart.link) {
- const preview =
- message &&
- message.previews &&
- message.previews.find((p) => p.link === textPart.link);
- const link = createElement(
- "a",
- {
- href: textPart.link,
- dir: preview ? null : "auto",
- target: "_blank",
- rel: "noopener",
- },
- fragments
- );
-
- if (!preview) {
- return link;
- }
-
- const linkEls = [link];
-
- if (preview.size > 0) {
- linkEls.push(
- createElement(LinkPreviewFileSize, {
- size: preview.size,
- })
- );
- }
-
- linkEls.push(
- createElement(LinkPreviewToggle, {
- link: preview,
- message: message,
- })
- );
-
- // We wrap the link, size, and the toggle button into
- // to correctly keep the left-to-right order of these elements
- return createElement(
- "span",
- {
- dir: "auto",
- },
- linkEls
- );
- } else if (textPart.channel) {
- return createElement(
- InlineChannel,
- {
- channel: textPart.channel,
- },
- {
- default: () => fragments,
- }
- );
- } else if (textPart.emoji) {
- const emojiWithoutModifiers = textPart.emoji.replace(emojiModifiersRegex, "");
- const title = emojiMap[emojiWithoutModifiers]
- ? `Emoji: ${emojiMap[emojiWithoutModifiers]}`
- : null;
-
- return createElement(
- "span",
- {
- class: ["emoji"],
- role: "img",
- "aria-label": title,
- title: title,
- },
- fragments
- );
- } else if (textPart.nick) {
- return createElement(
- Username,
- {
- user: {
- nick: textPart.nick,
- },
- dir: "auto",
- },
- {
- default: () => fragments,
- }
- );
- }
-
- return fragments;
- });
-}
-
-export default parse;
diff --git a/client/js/helpers/parseIrcUri.ts b/client/js/helpers/parseIrcUri.ts
deleted file mode 100644
index 05d6d067..00000000
--- a/client/js/helpers/parseIrcUri.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-export default (stringUri: string) => {
- const data = {
- name: "",
- host: "",
- port: "",
- join: "",
- tls: false,
- };
-
- try {
- // https://tools.ietf.org/html/draft-butcher-irc-url-04
- const uri = new URL(stringUri);
-
- // Replace protocol with a "special protocol" (that's what it's called in WHATWG spec)
- // So that the uri can be properly parsed
- if (uri.protocol === "irc:") {
- uri.protocol = "http:";
-
- if (!uri.port) {
- uri.port = "6667";
- }
- } else if (uri.protocol === "ircs:") {
- uri.protocol = "https:";
-
- if (!uri.port) {
- uri.port = "6697";
- }
-
- data.tls = true;
- } else {
- return;
- }
-
- if (!uri.hostname) {
- return {};
- }
-
- data.host = data.name = uri.hostname;
- data.port = uri.port;
-
- let channel = "";
-
- if (uri.pathname.length > 1) {
- channel = uri.pathname.substr(1); // Remove slash
- }
-
- if (uri.hash.length > 1) {
- channel += uri.hash;
- }
-
- // We don't split channels or append # here because the connect window takes care of that
- data.join = channel;
- } catch (e) {
- // do nothing on invalid uri
- }
-
- return data;
-};
diff --git a/client/js/helpers/roundBadgeNumber.ts b/client/js/helpers/roundBadgeNumber.ts
deleted file mode 100644
index dd7b6fdc..00000000
--- a/client/js/helpers/roundBadgeNumber.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export default (count: number) => {
- if (count < 1000) {
- return count.toString();
- }
-
- return (count / 1000).toFixed(2).slice(0, -1) + "k";
-};
diff --git a/client/js/helpers/simplemap.json b/client/js/helpers/simplemap.json
deleted file mode 100644
index 01b287f9..00000000
--- a/client/js/helpers/simplemap.json
+++ /dev/null
@@ -1,1915 +0,0 @@
-{
- "100": "💯",
- "1234": "🔢",
- "grinning": "😀",
- "smiley": "😃",
- "smile": "😄",
- "grin": "😁",
- "laughing": "😆",
- "satisfied": "😆",
- "sweat_smile": "😅",
- "rofl": "🤣",
- "joy": "😂",
- "slightly_smiling_face": "🙂",
- "upside_down_face": "🙃",
- "melting_face": "🫠",
- "wink": "😉",
- "blush": "😊",
- "innocent": "😇",
- "smiling_face_with_three_hearts": "🥰",
- "heart_eyes": "😍",
- "star_struck": "🤩",
- "kissing_heart": "😘",
- "kissing": "😗",
- "relaxed": "☺️",
- "kissing_closed_eyes": "😚",
- "kissing_smiling_eyes": "😙",
- "smiling_face_with_tear": "🥲",
- "yum": "😋",
- "stuck_out_tongue": "😛",
- "stuck_out_tongue_winking_eye": "😜",
- "zany_face": "🤪",
- "stuck_out_tongue_closed_eyes": "😝",
- "money_mouth_face": "🤑",
- "hugs": "🤗",
- "hand_over_mouth": "🤭",
- "face_with_open_eyes_and_hand_over_mouth": "🫢",
- "face_with_peeking_eye": "🫣",
- "shushing_face": "🤫",
- "thinking": "🤔",
- "saluting_face": "🫡",
- "zipper_mouth_face": "🤐",
- "raised_eyebrow": "🤨",
- "neutral_face": "😐",
- "expressionless": "😑",
- "no_mouth": "😶",
- "dotted_line_face": "🫥",
- "face_in_clouds": "😶🌫️",
- "smirk": "😏",
- "unamused": "😒",
- "roll_eyes": "🙄",
- "grimacing": "😬",
- "face_exhaling": "😮💨",
- "lying_face": "🤥",
- "shaking_face": "🫨",
- "relieved": "😌",
- "pensive": "😔",
- "sleepy": "😪",
- "drooling_face": "🤤",
- "sleeping": "😴",
- "mask": "😷",
- "face_with_thermometer": "🤒",
- "face_with_head_bandage": "🤕",
- "nauseated_face": "🤢",
- "vomiting_face": "🤮",
- "sneezing_face": "🤧",
- "hot_face": "🥵",
- "cold_face": "🥶",
- "woozy_face": "🥴",
- "dizzy_face": "😵",
- "face_with_spiral_eyes": "😵💫",
- "exploding_head": "🤯",
- "cowboy_hat_face": "🤠",
- "partying_face": "🥳",
- "disguised_face": "🥸",
- "sunglasses": "😎",
- "nerd_face": "🤓",
- "monocle_face": "🧐",
- "confused": "😕",
- "face_with_diagonal_mouth": "🫤",
- "worried": "😟",
- "slightly_frowning_face": "🙁",
- "frowning_face": "☹️",
- "open_mouth": "😮",
- "hushed": "😯",
- "astonished": "😲",
- "flushed": "😳",
- "pleading_face": "🥺",
- "face_holding_back_tears": "🥹",
- "frowning": "😦",
- "anguished": "😧",
- "fearful": "😨",
- "cold_sweat": "😰",
- "disappointed_relieved": "😥",
- "cry": "😢",
- "sob": "😭",
- "scream": "😱",
- "confounded": "😖",
- "persevere": "😣",
- "disappointed": "😞",
- "sweat": "😓",
- "weary": "😩",
- "tired_face": "😫",
- "yawning_face": "🥱",
- "triumph": "😤",
- "rage": "😡",
- "pout": "😡",
- "angry": "😠",
- "cursing_face": "🤬",
- "smiling_imp": "😈",
- "imp": "👿",
- "skull": "💀",
- "skull_and_crossbones": "☠️",
- "hankey": "💩",
- "poop": "💩",
- "shit": "💩",
- "clown_face": "🤡",
- "japanese_ogre": "👹",
- "japanese_goblin": "👺",
- "ghost": "👻",
- "alien": "👽",
- "space_invader": "👾",
- "robot": "🤖",
- "smiley_cat": "😺",
- "smile_cat": "😸",
- "joy_cat": "😹",
- "heart_eyes_cat": "😻",
- "smirk_cat": "😼",
- "kissing_cat": "😽",
- "scream_cat": "🙀",
- "crying_cat_face": "😿",
- "pouting_cat": "😾",
- "see_no_evil": "🙈",
- "hear_no_evil": "🙉",
- "speak_no_evil": "🙊",
- "love_letter": "💌",
- "cupid": "💘",
- "gift_heart": "💝",
- "sparkling_heart": "💖",
- "heartpulse": "💗",
- "heartbeat": "💓",
- "revolving_hearts": "💞",
- "two_hearts": "💕",
- "heart_decoration": "💟",
- "heavy_heart_exclamation": "❣️",
- "broken_heart": "💔",
- "heart_on_fire": "❤️🔥",
- "mending_heart": "❤️🩹",
- "heart": "❤️",
- "pink_heart": "🩷",
- "orange_heart": "🧡",
- "yellow_heart": "💛",
- "green_heart": "💚",
- "blue_heart": "💙",
- "light_blue_heart": "🩵",
- "purple_heart": "💜",
- "brown_heart": "🤎",
- "black_heart": "🖤",
- "grey_heart": "🩶",
- "white_heart": "🤍",
- "kiss": "💋",
- "anger": "💢",
- "boom": "💥",
- "collision": "💥",
- "dizzy": "💫",
- "sweat_drops": "💦",
- "dash": "💨",
- "hole": "🕳️",
- "speech_balloon": "💬",
- "eye_speech_bubble": "👁️🗨️",
- "left_speech_bubble": "🗨️",
- "right_anger_bubble": "🗯️",
- "thought_balloon": "💭",
- "zzz": "💤",
- "wave": "👋",
- "raised_back_of_hand": "🤚",
- "raised_hand_with_fingers_splayed": "🖐️",
- "hand": "✋",
- "raised_hand": "✋",
- "vulcan_salute": "🖖",
- "rightwards_hand": "🫱",
- "leftwards_hand": "🫲",
- "palm_down_hand": "🫳",
- "palm_up_hand": "🫴",
- "leftwards_pushing_hand": "🫷",
- "rightwards_pushing_hand": "🫸",
- "ok_hand": "👌",
- "pinched_fingers": "🤌",
- "pinching_hand": "🤏",
- "v": "✌️",
- "crossed_fingers": "🤞",
- "hand_with_index_finger_and_thumb_crossed": "🫰",
- "love_you_gesture": "🤟",
- "metal": "🤘",
- "call_me_hand": "🤙",
- "point_left": "👈",
- "point_right": "👉",
- "point_up_2": "👆",
- "middle_finger": "🖕",
- "fu": "🖕",
- "point_down": "👇",
- "point_up": "☝️",
- "index_pointing_at_the_viewer": "🫵",
- "+1": "👍",
- "thumbsup": "👍",
- "-1": "👎",
- "thumbsdown": "👎",
- "fist_raised": "✊",
- "fist": "✊",
- "fist_oncoming": "👊",
- "facepunch": "👊",
- "punch": "👊",
- "fist_left": "🤛",
- "fist_right": "🤜",
- "clap": "👏",
- "raised_hands": "🙌",
- "heart_hands": "🫶",
- "open_hands": "👐",
- "palms_up_together": "🤲",
- "handshake": "🤝",
- "pray": "🙏",
- "writing_hand": "✍️",
- "nail_care": "💅",
- "selfie": "🤳",
- "muscle": "💪",
- "mechanical_arm": "🦾",
- "mechanical_leg": "🦿",
- "leg": "🦵",
- "foot": "🦶",
- "ear": "👂",
- "ear_with_hearing_aid": "🦻",
- "nose": "👃",
- "brain": "🧠",
- "anatomical_heart": "🫀",
- "lungs": "🫁",
- "tooth": "🦷",
- "bone": "🦴",
- "eyes": "👀",
- "eye": "👁️",
- "tongue": "👅",
- "lips": "👄",
- "biting_lip": "🫦",
- "baby": "👶",
- "child": "🧒",
- "boy": "👦",
- "girl": "👧",
- "adult": "🧑",
- "blond_haired_person": "👱",
- "man": "👨",
- "bearded_person": "🧔",
- "man_beard": "🧔♂️",
- "woman_beard": "🧔♀️",
- "red_haired_man": "👨🦰",
- "curly_haired_man": "👨🦱",
- "white_haired_man": "👨🦳",
- "bald_man": "👨🦲",
- "woman": "👩",
- "red_haired_woman": "👩🦰",
- "person_red_hair": "🧑🦰",
- "curly_haired_woman": "👩🦱",
- "person_curly_hair": "🧑🦱",
- "white_haired_woman": "👩🦳",
- "person_white_hair": "🧑🦳",
- "bald_woman": "👩🦲",
- "person_bald": "🧑🦲",
- "blond_haired_woman": "👱♀️",
- "blonde_woman": "👱♀️",
- "blond_haired_man": "👱♂️",
- "older_adult": "🧓",
- "older_man": "👴",
- "older_woman": "👵",
- "frowning_person": "🙍",
- "frowning_man": "🙍♂️",
- "frowning_woman": "🙍♀️",
- "pouting_face": "🙎",
- "pouting_man": "🙎♂️",
- "pouting_woman": "🙎♀️",
- "no_good": "🙅",
- "no_good_man": "🙅♂️",
- "ng_man": "🙅♂️",
- "no_good_woman": "🙅♀️",
- "ng_woman": "🙅♀️",
- "ok_person": "🙆",
- "ok_man": "🙆♂️",
- "ok_woman": "🙆♀️",
- "tipping_hand_person": "💁",
- "information_desk_person": "💁",
- "tipping_hand_man": "💁♂️",
- "sassy_man": "💁♂️",
- "tipping_hand_woman": "💁♀️",
- "sassy_woman": "💁♀️",
- "raising_hand": "🙋",
- "raising_hand_man": "🙋♂️",
- "raising_hand_woman": "🙋♀️",
- "deaf_person": "🧏",
- "deaf_man": "🧏♂️",
- "deaf_woman": "🧏♀️",
- "bow": "🙇",
- "bowing_man": "🙇♂️",
- "bowing_woman": "🙇♀️",
- "facepalm": "🤦",
- "man_facepalming": "🤦♂️",
- "woman_facepalming": "🤦♀️",
- "shrug": "🤷",
- "man_shrugging": "🤷♂️",
- "woman_shrugging": "🤷♀️",
- "health_worker": "🧑⚕️",
- "man_health_worker": "👨⚕️",
- "woman_health_worker": "👩⚕️",
- "student": "🧑🎓",
- "man_student": "👨🎓",
- "woman_student": "👩🎓",
- "teacher": "🧑🏫",
- "man_teacher": "👨🏫",
- "woman_teacher": "👩🏫",
- "judge": "🧑⚖️",
- "man_judge": "👨⚖️",
- "woman_judge": "👩⚖️",
- "farmer": "🧑🌾",
- "man_farmer": "👨🌾",
- "woman_farmer": "👩🌾",
- "cook": "🧑🍳",
- "man_cook": "👨🍳",
- "woman_cook": "👩🍳",
- "mechanic": "🧑🔧",
- "man_mechanic": "👨🔧",
- "woman_mechanic": "👩🔧",
- "factory_worker": "🧑🏭",
- "man_factory_worker": "👨🏭",
- "woman_factory_worker": "👩🏭",
- "office_worker": "🧑💼",
- "man_office_worker": "👨💼",
- "woman_office_worker": "👩💼",
- "scientist": "🧑🔬",
- "man_scientist": "👨🔬",
- "woman_scientist": "👩🔬",
- "technologist": "🧑💻",
- "man_technologist": "👨💻",
- "woman_technologist": "👩💻",
- "singer": "🧑🎤",
- "man_singer": "👨🎤",
- "woman_singer": "👩🎤",
- "artist": "🧑🎨",
- "man_artist": "👨🎨",
- "woman_artist": "👩🎨",
- "pilot": "🧑✈️",
- "man_pilot": "👨✈️",
- "woman_pilot": "👩✈️",
- "astronaut": "🧑🚀",
- "man_astronaut": "👨🚀",
- "woman_astronaut": "👩🚀",
- "firefighter": "🧑🚒",
- "man_firefighter": "👨🚒",
- "woman_firefighter": "👩🚒",
- "police_officer": "👮",
- "cop": "👮",
- "policeman": "👮♂️",
- "policewoman": "👮♀️",
- "detective": "🕵️",
- "male_detective": "🕵️♂️",
- "female_detective": "🕵️♀️",
- "guard": "💂",
- "guardsman": "💂♂️",
- "guardswoman": "💂♀️",
- "ninja": "🥷",
- "construction_worker": "👷",
- "construction_worker_man": "👷♂️",
- "construction_worker_woman": "👷♀️",
- "person_with_crown": "🫅",
- "prince": "🤴",
- "princess": "👸",
- "person_with_turban": "👳",
- "man_with_turban": "👳♂️",
- "woman_with_turban": "👳♀️",
- "man_with_gua_pi_mao": "👲",
- "woman_with_headscarf": "🧕",
- "person_in_tuxedo": "🤵",
- "man_in_tuxedo": "🤵♂️",
- "woman_in_tuxedo": "🤵♀️",
- "person_with_veil": "👰",
- "man_with_veil": "👰♂️",
- "woman_with_veil": "👰♀️",
- "bride_with_veil": "👰♀️",
- "pregnant_woman": "🤰",
- "pregnant_man": "🫃",
- "pregnant_person": "🫄",
- "breast_feeding": "🤱",
- "woman_feeding_baby": "👩🍼",
- "man_feeding_baby": "👨🍼",
- "person_feeding_baby": "🧑🍼",
- "angel": "👼",
- "santa": "🎅",
- "mrs_claus": "🤶",
- "mx_claus": "🧑🎄",
- "superhero": "🦸",
- "superhero_man": "🦸♂️",
- "superhero_woman": "🦸♀️",
- "supervillain": "🦹",
- "supervillain_man": "🦹♂️",
- "supervillain_woman": "🦹♀️",
- "mage": "🧙",
- "mage_man": "🧙♂️",
- "mage_woman": "🧙♀️",
- "fairy": "🧚",
- "fairy_man": "🧚♂️",
- "fairy_woman": "🧚♀️",
- "vampire": "🧛",
- "vampire_man": "🧛♂️",
- "vampire_woman": "🧛♀️",
- "merperson": "🧜",
- "merman": "🧜♂️",
- "mermaid": "🧜♀️",
- "elf": "🧝",
- "elf_man": "🧝♂️",
- "elf_woman": "🧝♀️",
- "genie": "🧞",
- "genie_man": "🧞♂️",
- "genie_woman": "🧞♀️",
- "zombie": "🧟",
- "zombie_man": "🧟♂️",
- "zombie_woman": "🧟♀️",
- "troll": "🧌",
- "massage": "💆",
- "massage_man": "💆♂️",
- "massage_woman": "💆♀️",
- "haircut": "💇",
- "haircut_man": "💇♂️",
- "haircut_woman": "💇♀️",
- "walking": "🚶",
- "walking_man": "🚶♂️",
- "walking_woman": "🚶♀️",
- "standing_person": "🧍",
- "standing_man": "🧍♂️",
- "standing_woman": "🧍♀️",
- "kneeling_person": "🧎",
- "kneeling_man": "🧎♂️",
- "kneeling_woman": "🧎♀️",
- "person_with_probing_cane": "🧑🦯",
- "man_with_probing_cane": "👨🦯",
- "woman_with_probing_cane": "👩🦯",
- "person_in_motorized_wheelchair": "🧑🦼",
- "man_in_motorized_wheelchair": "👨🦼",
- "woman_in_motorized_wheelchair": "👩🦼",
- "person_in_manual_wheelchair": "🧑🦽",
- "man_in_manual_wheelchair": "👨🦽",
- "woman_in_manual_wheelchair": "👩🦽",
- "runner": "🏃",
- "running": "🏃",
- "running_man": "🏃♂️",
- "running_woman": "🏃♀️",
- "woman_dancing": "💃",
- "dancer": "💃",
- "man_dancing": "🕺",
- "business_suit_levitating": "🕴️",
- "dancers": "👯",
- "dancing_men": "👯♂️",
- "dancing_women": "👯♀️",
- "sauna_person": "🧖",
- "sauna_man": "🧖♂️",
- "sauna_woman": "🧖♀️",
- "climbing": "🧗",
- "climbing_man": "🧗♂️",
- "climbing_woman": "🧗♀️",
- "person_fencing": "🤺",
- "horse_racing": "🏇",
- "skier": "⛷️",
- "snowboarder": "🏂",
- "golfing": "🏌️",
- "golfing_man": "🏌️♂️",
- "golfing_woman": "🏌️♀️",
- "surfer": "🏄",
- "surfing_man": "🏄♂️",
- "surfing_woman": "🏄♀️",
- "rowboat": "🚣",
- "rowing_man": "🚣♂️",
- "rowing_woman": "🚣♀️",
- "swimmer": "🏊",
- "swimming_man": "🏊♂️",
- "swimming_woman": "🏊♀️",
- "bouncing_ball_person": "⛹️",
- "bouncing_ball_man": "⛹️♂️",
- "basketball_man": "⛹️♂️",
- "bouncing_ball_woman": "⛹️♀️",
- "basketball_woman": "⛹️♀️",
- "weight_lifting": "🏋️",
- "weight_lifting_man": "🏋️♂️",
- "weight_lifting_woman": "🏋️♀️",
- "bicyclist": "🚴",
- "biking_man": "🚴♂️",
- "biking_woman": "🚴♀️",
- "mountain_bicyclist": "🚵",
- "mountain_biking_man": "🚵♂️",
- "mountain_biking_woman": "🚵♀️",
- "cartwheeling": "🤸",
- "man_cartwheeling": "🤸♂️",
- "woman_cartwheeling": "🤸♀️",
- "wrestling": "🤼",
- "men_wrestling": "🤼♂️",
- "women_wrestling": "🤼♀️",
- "water_polo": "🤽",
- "man_playing_water_polo": "🤽♂️",
- "woman_playing_water_polo": "🤽♀️",
- "handball_person": "🤾",
- "man_playing_handball": "🤾♂️",
- "woman_playing_handball": "🤾♀️",
- "juggling_person": "🤹",
- "man_juggling": "🤹♂️",
- "woman_juggling": "🤹♀️",
- "lotus_position": "🧘",
- "lotus_position_man": "🧘♂️",
- "lotus_position_woman": "🧘♀️",
- "bath": "🛀",
- "sleeping_bed": "🛌",
- "people_holding_hands": "🧑🤝🧑",
- "two_women_holding_hands": "👭",
- "couple": "👫",
- "two_men_holding_hands": "👬",
- "couplekiss": "💏",
- "couplekiss_man_woman": "👩❤️💋👨",
- "couplekiss_man_man": "👨❤️💋👨",
- "couplekiss_woman_woman": "👩❤️💋👩",
- "couple_with_heart": "💑",
- "couple_with_heart_woman_man": "👩❤️👨",
- "couple_with_heart_man_man": "👨❤️👨",
- "couple_with_heart_woman_woman": "👩❤️👩",
- "family": "👪",
- "family_man_woman_boy": "👨👩👦",
- "family_man_woman_girl": "👨👩👧",
- "family_man_woman_girl_boy": "👨👩👧👦",
- "family_man_woman_boy_boy": "👨👩👦👦",
- "family_man_woman_girl_girl": "👨👩👧👧",
- "family_man_man_boy": "👨👨👦",
- "family_man_man_girl": "👨👨👧",
- "family_man_man_girl_boy": "👨👨👧👦",
- "family_man_man_boy_boy": "👨👨👦👦",
- "family_man_man_girl_girl": "👨👨👧👧",
- "family_woman_woman_boy": "👩👩👦",
- "family_woman_woman_girl": "👩👩👧",
- "family_woman_woman_girl_boy": "👩👩👧👦",
- "family_woman_woman_boy_boy": "👩👩👦👦",
- "family_woman_woman_girl_girl": "👩👩👧👧",
- "family_man_boy": "👨👦",
- "family_man_boy_boy": "👨👦👦",
- "family_man_girl": "👨👧",
- "family_man_girl_boy": "👨👧👦",
- "family_man_girl_girl": "👨👧👧",
- "family_woman_boy": "👩👦",
- "family_woman_boy_boy": "👩👦👦",
- "family_woman_girl": "👩👧",
- "family_woman_girl_boy": "👩👧👦",
- "family_woman_girl_girl": "👩👧👧",
- "speaking_head": "🗣️",
- "bust_in_silhouette": "👤",
- "busts_in_silhouette": "👥",
- "people_hugging": "🫂",
- "footprints": "👣",
- "monkey_face": "🐵",
- "monkey": "🐒",
- "gorilla": "🦍",
- "orangutan": "🦧",
- "dog": "🐶",
- "dog2": "🐕",
- "guide_dog": "🦮",
- "service_dog": "🐕🦺",
- "poodle": "🐩",
- "wolf": "🐺",
- "fox_face": "🦊",
- "raccoon": "🦝",
- "cat": "🐱",
- "cat2": "🐈",
- "black_cat": "🐈⬛",
- "lion": "🦁",
- "tiger": "🐯",
- "tiger2": "🐅",
- "leopard": "🐆",
- "horse": "🐴",
- "moose": "🫎",
- "donkey": "🫏",
- "racehorse": "🐎",
- "unicorn": "🦄",
- "zebra": "🦓",
- "deer": "🦌",
- "bison": "🦬",
- "cow": "🐮",
- "ox": "🐂",
- "water_buffalo": "🐃",
- "cow2": "🐄",
- "pig": "🐷",
- "pig2": "🐖",
- "boar": "🐗",
- "pig_nose": "🐽",
- "ram": "🐏",
- "sheep": "🐑",
- "goat": "🐐",
- "dromedary_camel": "🐪",
- "camel": "🐫",
- "llama": "🦙",
- "giraffe": "🦒",
- "elephant": "🐘",
- "mammoth": "🦣",
- "rhinoceros": "🦏",
- "hippopotamus": "🦛",
- "mouse": "🐭",
- "mouse2": "🐁",
- "rat": "🐀",
- "hamster": "🐹",
- "rabbit": "🐰",
- "rabbit2": "🐇",
- "chipmunk": "🐿️",
- "beaver": "🦫",
- "hedgehog": "🦔",
- "bat": "🦇",
- "bear": "🐻",
- "polar_bear": "🐻❄️",
- "koala": "🐨",
- "panda_face": "🐼",
- "sloth": "🦥",
- "otter": "🦦",
- "skunk": "🦨",
- "kangaroo": "🦘",
- "badger": "🦡",
- "feet": "🐾",
- "paw_prints": "🐾",
- "turkey": "🦃",
- "chicken": "🐔",
- "rooster": "🐓",
- "hatching_chick": "🐣",
- "baby_chick": "🐤",
- "hatched_chick": "🐥",
- "bird": "🐦",
- "penguin": "🐧",
- "dove": "🕊️",
- "eagle": "🦅",
- "duck": "🦆",
- "swan": "🦢",
- "owl": "🦉",
- "dodo": "🦤",
- "feather": "🪶",
- "flamingo": "🦩",
- "peacock": "🦚",
- "parrot": "🦜",
- "wing": "🪽",
- "black_bird": "🐦⬛",
- "goose": "🪿",
- "frog": "🐸",
- "crocodile": "🐊",
- "turtle": "🐢",
- "lizard": "🦎",
- "snake": "🐍",
- "dragon_face": "🐲",
- "dragon": "🐉",
- "sauropod": "🦕",
- "t_rex": "🦖",
- "whale": "🐳",
- "whale2": "🐋",
- "dolphin": "🐬",
- "flipper": "🐬",
- "seal": "🦭",
- "fish": "🐟",
- "tropical_fish": "🐠",
- "blowfish": "🐡",
- "shark": "🦈",
- "octopus": "🐙",
- "shell": "🐚",
- "coral": "🪸",
- "jellyfish": "🪼",
- "snail": "🐌",
- "butterfly": "🦋",
- "bug": "🐛",
- "ant": "🐜",
- "bee": "🐝",
- "honeybee": "🐝",
- "beetle": "🪲",
- "lady_beetle": "🐞",
- "cricket": "🦗",
- "cockroach": "🪳",
- "spider": "🕷️",
- "spider_web": "🕸️",
- "scorpion": "🦂",
- "mosquito": "🦟",
- "fly": "🪰",
- "worm": "🪱",
- "microbe": "🦠",
- "bouquet": "💐",
- "cherry_blossom": "🌸",
- "white_flower": "💮",
- "lotus": "🪷",
- "rosette": "🏵️",
- "rose": "🌹",
- "wilted_flower": "🥀",
- "hibiscus": "🌺",
- "sunflower": "🌻",
- "blossom": "🌼",
- "tulip": "🌷",
- "hyacinth": "🪻",
- "seedling": "🌱",
- "potted_plant": "🪴",
- "evergreen_tree": "🌲",
- "deciduous_tree": "🌳",
- "palm_tree": "🌴",
- "cactus": "🌵",
- "ear_of_rice": "🌾",
- "herb": "🌿",
- "shamrock": "☘️",
- "four_leaf_clover": "🍀",
- "maple_leaf": "🍁",
- "fallen_leaf": "🍂",
- "leaves": "🍃",
- "empty_nest": "🪹",
- "nest_with_eggs": "🪺",
- "mushroom": "🍄",
- "grapes": "🍇",
- "melon": "🍈",
- "watermelon": "🍉",
- "tangerine": "🍊",
- "orange": "🍊",
- "mandarin": "🍊",
- "lemon": "🍋",
- "banana": "🍌",
- "pineapple": "🍍",
- "mango": "🥭",
- "apple": "🍎",
- "green_apple": "🍏",
- "pear": "🍐",
- "peach": "🍑",
- "cherries": "🍒",
- "strawberry": "🍓",
- "blueberries": "🫐",
- "kiwi_fruit": "🥝",
- "tomato": "🍅",
- "olive": "🫒",
- "coconut": "🥥",
- "avocado": "🥑",
- "eggplant": "🍆",
- "potato": "🥔",
- "carrot": "🥕",
- "corn": "🌽",
- "hot_pepper": "🌶️",
- "bell_pepper": "🫑",
- "cucumber": "🥒",
- "leafy_green": "🥬",
- "broccoli": "🥦",
- "garlic": "🧄",
- "onion": "🧅",
- "peanuts": "🥜",
- "beans": "🫘",
- "chestnut": "🌰",
- "ginger_root": "🫚",
- "pea_pod": "🫛",
- "bread": "🍞",
- "croissant": "🥐",
- "baguette_bread": "🥖",
- "flatbread": "🫓",
- "pretzel": "🥨",
- "bagel": "🥯",
- "pancakes": "🥞",
- "waffle": "🧇",
- "cheese": "🧀",
- "meat_on_bone": "🍖",
- "poultry_leg": "🍗",
- "cut_of_meat": "🥩",
- "bacon": "🥓",
- "hamburger": "🍔",
- "fries": "🍟",
- "pizza": "🍕",
- "hotdog": "🌭",
- "sandwich": "🥪",
- "taco": "🌮",
- "burrito": "🌯",
- "tamale": "🫔",
- "stuffed_flatbread": "🥙",
- "falafel": "🧆",
- "egg": "🥚",
- "fried_egg": "🍳",
- "shallow_pan_of_food": "🥘",
- "stew": "🍲",
- "fondue": "🫕",
- "bowl_with_spoon": "🥣",
- "green_salad": "🥗",
- "popcorn": "🍿",
- "butter": "🧈",
- "salt": "🧂",
- "canned_food": "🥫",
- "bento": "🍱",
- "rice_cracker": "🍘",
- "rice_ball": "🍙",
- "rice": "🍚",
- "curry": "🍛",
- "ramen": "🍜",
- "spaghetti": "🍝",
- "sweet_potato": "🍠",
- "oden": "🍢",
- "sushi": "🍣",
- "fried_shrimp": "🍤",
- "fish_cake": "🍥",
- "moon_cake": "🥮",
- "dango": "🍡",
- "dumpling": "🥟",
- "fortune_cookie": "🥠",
- "takeout_box": "🥡",
- "crab": "🦀",
- "lobster": "🦞",
- "shrimp": "🦐",
- "squid": "🦑",
- "oyster": "🦪",
- "icecream": "🍦",
- "shaved_ice": "🍧",
- "ice_cream": "🍨",
- "doughnut": "🍩",
- "cookie": "🍪",
- "birthday": "🎂",
- "cake": "🍰",
- "cupcake": "🧁",
- "pie": "🥧",
- "chocolate_bar": "🍫",
- "candy": "🍬",
- "lollipop": "🍭",
- "custard": "🍮",
- "honey_pot": "🍯",
- "baby_bottle": "🍼",
- "milk_glass": "🥛",
- "coffee": "☕",
- "teapot": "🫖",
- "tea": "🍵",
- "sake": "🍶",
- "champagne": "🍾",
- "wine_glass": "🍷",
- "cocktail": "🍸",
- "tropical_drink": "🍹",
- "beer": "🍺",
- "beers": "🍻",
- "clinking_glasses": "🥂",
- "tumbler_glass": "🥃",
- "pouring_liquid": "🫗",
- "cup_with_straw": "🥤",
- "bubble_tea": "🧋",
- "beverage_box": "🧃",
- "mate": "🧉",
- "ice_cube": "🧊",
- "chopsticks": "🥢",
- "plate_with_cutlery": "🍽️",
- "fork_and_knife": "🍴",
- "spoon": "🥄",
- "hocho": "🔪",
- "knife": "🔪",
- "jar": "🫙",
- "amphora": "🏺",
- "earth_africa": "🌍",
- "earth_americas": "🌎",
- "earth_asia": "🌏",
- "globe_with_meridians": "🌐",
- "world_map": "🗺️",
- "japan": "🗾",
- "compass": "🧭",
- "mountain_snow": "🏔️",
- "mountain": "⛰️",
- "volcano": "🌋",
- "mount_fuji": "🗻",
- "camping": "🏕️",
- "beach_umbrella": "🏖️",
- "desert": "🏜️",
- "desert_island": "🏝️",
- "national_park": "🏞️",
- "stadium": "🏟️",
- "classical_building": "🏛️",
- "building_construction": "🏗️",
- "bricks": "🧱",
- "rock": "🪨",
- "wood": "🪵",
- "hut": "🛖",
- "houses": "🏘️",
- "derelict_house": "🏚️",
- "house": "🏠",
- "house_with_garden": "🏡",
- "office": "🏢",
- "post_office": "🏣",
- "european_post_office": "🏤",
- "hospital": "🏥",
- "bank": "🏦",
- "hotel": "🏨",
- "love_hotel": "🏩",
- "convenience_store": "🏪",
- "school": "🏫",
- "department_store": "🏬",
- "factory": "🏭",
- "japanese_castle": "🏯",
- "european_castle": "🏰",
- "wedding": "💒",
- "tokyo_tower": "🗼",
- "statue_of_liberty": "🗽",
- "church": "⛪",
- "mosque": "🕌",
- "hindu_temple": "🛕",
- "synagogue": "🕍",
- "shinto_shrine": "⛩️",
- "kaaba": "🕋",
- "fountain": "⛲",
- "tent": "⛺",
- "foggy": "🌁",
- "night_with_stars": "🌃",
- "cityscape": "🏙️",
- "sunrise_over_mountains": "🌄",
- "sunrise": "🌅",
- "city_sunset": "🌆",
- "city_sunrise": "🌇",
- "bridge_at_night": "🌉",
- "hotsprings": "♨️",
- "carousel_horse": "🎠",
- "playground_slide": "🛝",
- "ferris_wheel": "🎡",
- "roller_coaster": "🎢",
- "barber": "💈",
- "circus_tent": "🎪",
- "steam_locomotive": "🚂",
- "railway_car": "🚃",
- "bullettrain_side": "🚄",
- "bullettrain_front": "🚅",
- "train2": "🚆",
- "metro": "🚇",
- "light_rail": "🚈",
- "station": "🚉",
- "tram": "🚊",
- "monorail": "🚝",
- "mountain_railway": "🚞",
- "train": "🚋",
- "bus": "🚌",
- "oncoming_bus": "🚍",
- "trolleybus": "🚎",
- "minibus": "🚐",
- "ambulance": "🚑",
- "fire_engine": "🚒",
- "police_car": "🚓",
- "oncoming_police_car": "🚔",
- "taxi": "🚕",
- "oncoming_taxi": "🚖",
- "car": "🚗",
- "red_car": "🚗",
- "oncoming_automobile": "🚘",
- "blue_car": "🚙",
- "pickup_truck": "🛻",
- "truck": "🚚",
- "articulated_lorry": "🚛",
- "tractor": "🚜",
- "racing_car": "🏎️",
- "motorcycle": "🏍️",
- "motor_scooter": "🛵",
- "manual_wheelchair": "🦽",
- "motorized_wheelchair": "🦼",
- "auto_rickshaw": "🛺",
- "bike": "🚲",
- "kick_scooter": "🛴",
- "skateboard": "🛹",
- "roller_skate": "🛼",
- "busstop": "🚏",
- "motorway": "🛣️",
- "railway_track": "🛤️",
- "oil_drum": "🛢️",
- "fuelpump": "⛽",
- "wheel": "🛞",
- "rotating_light": "🚨",
- "traffic_light": "🚥",
- "vertical_traffic_light": "🚦",
- "stop_sign": "🛑",
- "construction": "🚧",
- "anchor": "⚓",
- "ring_buoy": "🛟",
- "boat": "⛵",
- "sailboat": "⛵",
- "canoe": "🛶",
- "speedboat": "🚤",
- "passenger_ship": "🛳️",
- "ferry": "⛴️",
- "motor_boat": "🛥️",
- "ship": "🚢",
- "airplane": "✈️",
- "small_airplane": "🛩️",
- "flight_departure": "🛫",
- "flight_arrival": "🛬",
- "parachute": "🪂",
- "seat": "💺",
- "helicopter": "🚁",
- "suspension_railway": "🚟",
- "mountain_cableway": "🚠",
- "aerial_tramway": "🚡",
- "artificial_satellite": "🛰️",
- "rocket": "🚀",
- "flying_saucer": "🛸",
- "bellhop_bell": "🛎️",
- "luggage": "🧳",
- "hourglass": "⌛",
- "hourglass_flowing_sand": "⏳",
- "watch": "⌚",
- "alarm_clock": "⏰",
- "stopwatch": "⏱️",
- "timer_clock": "⏲️",
- "mantelpiece_clock": "🕰️",
- "clock12": "🕛",
- "clock1230": "🕧",
- "clock1": "🕐",
- "clock130": "🕜",
- "clock2": "🕑",
- "clock230": "🕝",
- "clock3": "🕒",
- "clock330": "🕞",
- "clock4": "🕓",
- "clock430": "🕟",
- "clock5": "🕔",
- "clock530": "🕠",
- "clock6": "🕕",
- "clock630": "🕡",
- "clock7": "🕖",
- "clock730": "🕢",
- "clock8": "🕗",
- "clock830": "🕣",
- "clock9": "🕘",
- "clock930": "🕤",
- "clock10": "🕙",
- "clock1030": "🕥",
- "clock11": "🕚",
- "clock1130": "🕦",
- "new_moon": "🌑",
- "waxing_crescent_moon": "🌒",
- "first_quarter_moon": "🌓",
- "moon": "🌔",
- "waxing_gibbous_moon": "🌔",
- "full_moon": "🌕",
- "waning_gibbous_moon": "🌖",
- "last_quarter_moon": "🌗",
- "waning_crescent_moon": "🌘",
- "crescent_moon": "🌙",
- "new_moon_with_face": "🌚",
- "first_quarter_moon_with_face": "🌛",
- "last_quarter_moon_with_face": "🌜",
- "thermometer": "🌡️",
- "sunny": "☀️",
- "full_moon_with_face": "🌝",
- "sun_with_face": "🌞",
- "ringed_planet": "🪐",
- "star": "⭐",
- "star2": "🌟",
- "stars": "🌠",
- "milky_way": "🌌",
- "cloud": "☁️",
- "partly_sunny": "⛅",
- "cloud_with_lightning_and_rain": "⛈️",
- "sun_behind_small_cloud": "🌤️",
- "sun_behind_large_cloud": "🌥️",
- "sun_behind_rain_cloud": "🌦️",
- "cloud_with_rain": "🌧️",
- "cloud_with_snow": "🌨️",
- "cloud_with_lightning": "🌩️",
- "tornado": "🌪️",
- "fog": "🌫️",
- "wind_face": "🌬️",
- "cyclone": "🌀",
- "rainbow": "🌈",
- "closed_umbrella": "🌂",
- "open_umbrella": "☂️",
- "umbrella": "☔",
- "parasol_on_ground": "⛱️",
- "zap": "⚡",
- "snowflake": "❄️",
- "snowman_with_snow": "☃️",
- "snowman": "⛄",
- "comet": "☄️",
- "fire": "🔥",
- "droplet": "💧",
- "ocean": "🌊",
- "jack_o_lantern": "🎃",
- "christmas_tree": "🎄",
- "fireworks": "🎆",
- "sparkler": "🎇",
- "firecracker": "🧨",
- "sparkles": "✨",
- "balloon": "🎈",
- "tada": "🎉",
- "confetti_ball": "🎊",
- "tanabata_tree": "🎋",
- "bamboo": "🎍",
- "dolls": "🎎",
- "flags": "🎏",
- "wind_chime": "🎐",
- "rice_scene": "🎑",
- "red_envelope": "🧧",
- "ribbon": "🎀",
- "gift": "🎁",
- "reminder_ribbon": "🎗️",
- "tickets": "🎟️",
- "ticket": "🎫",
- "medal_military": "🎖️",
- "trophy": "🏆",
- "medal_sports": "🏅",
- "1st_place_medal": "🥇",
- "2nd_place_medal": "🥈",
- "3rd_place_medal": "🥉",
- "soccer": "⚽",
- "baseball": "⚾",
- "softball": "🥎",
- "basketball": "🏀",
- "volleyball": "🏐",
- "football": "🏈",
- "rugby_football": "🏉",
- "tennis": "🎾",
- "flying_disc": "🥏",
- "bowling": "🎳",
- "cricket_game": "🏏",
- "field_hockey": "🏑",
- "ice_hockey": "🏒",
- "lacrosse": "🥍",
- "ping_pong": "🏓",
- "badminton": "🏸",
- "boxing_glove": "🥊",
- "martial_arts_uniform": "🥋",
- "goal_net": "🥅",
- "golf": "⛳",
- "ice_skate": "⛸️",
- "fishing_pole_and_fish": "🎣",
- "diving_mask": "🤿",
- "running_shirt_with_sash": "🎽",
- "ski": "🎿",
- "sled": "🛷",
- "curling_stone": "🥌",
- "dart": "🎯",
- "yo_yo": "🪀",
- "kite": "🪁",
- "gun": "🔫",
- "8ball": "🎱",
- "crystal_ball": "🔮",
- "magic_wand": "🪄",
- "video_game": "🎮",
- "joystick": "🕹️",
- "slot_machine": "🎰",
- "game_die": "🎲",
- "jigsaw": "🧩",
- "teddy_bear": "🧸",
- "pinata": "🪅",
- "mirror_ball": "🪩",
- "nesting_dolls": "🪆",
- "spades": "♠️",
- "hearts": "♥️",
- "diamonds": "♦️",
- "clubs": "♣️",
- "chess_pawn": "♟️",
- "black_joker": "🃏",
- "mahjong": "🀄",
- "flower_playing_cards": "🎴",
- "performing_arts": "🎭",
- "framed_picture": "🖼️",
- "art": "🎨",
- "thread": "🧵",
- "sewing_needle": "🪡",
- "yarn": "🧶",
- "knot": "🪢",
- "eyeglasses": "👓",
- "dark_sunglasses": "🕶️",
- "goggles": "🥽",
- "lab_coat": "🥼",
- "safety_vest": "🦺",
- "necktie": "👔",
- "shirt": "👕",
- "tshirt": "👕",
- "jeans": "👖",
- "scarf": "🧣",
- "gloves": "🧤",
- "coat": "🧥",
- "socks": "🧦",
- "dress": "👗",
- "kimono": "👘",
- "sari": "🥻",
- "one_piece_swimsuit": "🩱",
- "swim_brief": "🩲",
- "shorts": "🩳",
- "bikini": "👙",
- "womans_clothes": "👚",
- "folding_hand_fan": "🪭",
- "purse": "👛",
- "handbag": "👜",
- "pouch": "👝",
- "shopping": "🛍️",
- "school_satchel": "🎒",
- "thong_sandal": "🩴",
- "mans_shoe": "👞",
- "shoe": "👞",
- "athletic_shoe": "👟",
- "hiking_boot": "🥾",
- "flat_shoe": "🥿",
- "high_heel": "👠",
- "sandal": "👡",
- "ballet_shoes": "🩰",
- "boot": "👢",
- "hair_pick": "🪮",
- "crown": "👑",
- "womans_hat": "👒",
- "tophat": "🎩",
- "mortar_board": "🎓",
- "billed_cap": "🧢",
- "military_helmet": "🪖",
- "rescue_worker_helmet": "⛑️",
- "prayer_beads": "📿",
- "lipstick": "💄",
- "ring": "💍",
- "gem": "💎",
- "mute": "🔇",
- "speaker": "🔈",
- "sound": "🔉",
- "loud_sound": "🔊",
- "loudspeaker": "📢",
- "mega": "📣",
- "postal_horn": "📯",
- "bell": "🔔",
- "no_bell": "🔕",
- "musical_score": "🎼",
- "musical_note": "🎵",
- "notes": "🎶",
- "studio_microphone": "🎙️",
- "level_slider": "🎚️",
- "control_knobs": "🎛️",
- "microphone": "🎤",
- "headphones": "🎧",
- "radio": "📻",
- "saxophone": "🎷",
- "accordion": "🪗",
- "guitar": "🎸",
- "musical_keyboard": "🎹",
- "trumpet": "🎺",
- "violin": "🎻",
- "banjo": "🪕",
- "drum": "🥁",
- "long_drum": "🪘",
- "maracas": "🪇",
- "flute": "🪈",
- "iphone": "📱",
- "calling": "📲",
- "phone": "☎️",
- "telephone": "☎️",
- "telephone_receiver": "📞",
- "pager": "📟",
- "fax": "📠",
- "battery": "🔋",
- "low_battery": "🪫",
- "electric_plug": "🔌",
- "computer": "💻",
- "desktop_computer": "🖥️",
- "printer": "🖨️",
- "keyboard": "⌨️",
- "computer_mouse": "🖱️",
- "trackball": "🖲️",
- "minidisc": "💽",
- "floppy_disk": "💾",
- "cd": "💿",
- "dvd": "📀",
- "abacus": "🧮",
- "movie_camera": "🎥",
- "film_strip": "🎞️",
- "film_projector": "📽️",
- "clapper": "🎬",
- "tv": "📺",
- "camera": "📷",
- "camera_flash": "📸",
- "video_camera": "📹",
- "vhs": "📼",
- "mag": "🔍",
- "mag_right": "🔎",
- "candle": "🕯️",
- "bulb": "💡",
- "flashlight": "🔦",
- "izakaya_lantern": "🏮",
- "lantern": "🏮",
- "diya_lamp": "🪔",
- "notebook_with_decorative_cover": "📔",
- "closed_book": "📕",
- "book": "📖",
- "open_book": "📖",
- "green_book": "📗",
- "blue_book": "📘",
- "orange_book": "📙",
- "books": "📚",
- "notebook": "📓",
- "ledger": "📒",
- "page_with_curl": "📃",
- "scroll": "📜",
- "page_facing_up": "📄",
- "newspaper": "📰",
- "newspaper_roll": "🗞️",
- "bookmark_tabs": "📑",
- "bookmark": "🔖",
- "label": "🏷️",
- "moneybag": "💰",
- "coin": "🪙",
- "yen": "💴",
- "dollar": "💵",
- "euro": "💶",
- "pound": "💷",
- "money_with_wings": "💸",
- "credit_card": "💳",
- "receipt": "🧾",
- "chart": "💹",
- "envelope": "✉️",
- "email": "📧",
- "e_mail": "📧",
- "incoming_envelope": "📨",
- "envelope_with_arrow": "📩",
- "outbox_tray": "📤",
- "inbox_tray": "📥",
- "package": "📦",
- "mailbox": "📫",
- "mailbox_closed": "📪",
- "mailbox_with_mail": "📬",
- "mailbox_with_no_mail": "📭",
- "postbox": "📮",
- "ballot_box": "🗳️",
- "pencil2": "✏️",
- "black_nib": "✒️",
- "fountain_pen": "🖋️",
- "pen": "🖊️",
- "paintbrush": "🖌️",
- "crayon": "🖍️",
- "memo": "📝",
- "pencil": "📝",
- "briefcase": "💼",
- "file_folder": "📁",
- "open_file_folder": "📂",
- "card_index_dividers": "🗂️",
- "date": "📅",
- "calendar": "📆",
- "spiral_notepad": "🗒️",
- "spiral_calendar": "🗓️",
- "card_index": "📇",
- "chart_with_upwards_trend": "📈",
- "chart_with_downwards_trend": "📉",
- "bar_chart": "📊",
- "clipboard": "📋",
- "pushpin": "📌",
- "round_pushpin": "📍",
- "paperclip": "📎",
- "paperclips": "🖇️",
- "straight_ruler": "📏",
- "triangular_ruler": "📐",
- "scissors": "✂️",
- "card_file_box": "🗃️",
- "file_cabinet": "🗄️",
- "wastebasket": "🗑️",
- "lock": "🔒",
- "unlock": "🔓",
- "lock_with_ink_pen": "🔏",
- "closed_lock_with_key": "🔐",
- "key": "🔑",
- "old_key": "🗝️",
- "hammer": "🔨",
- "axe": "🪓",
- "pick": "⛏️",
- "hammer_and_pick": "⚒️",
- "hammer_and_wrench": "🛠️",
- "dagger": "🗡️",
- "crossed_swords": "⚔️",
- "bomb": "💣",
- "boomerang": "🪃",
- "bow_and_arrow": "🏹",
- "shield": "🛡️",
- "carpentry_saw": "🪚",
- "wrench": "🔧",
- "screwdriver": "🪛",
- "nut_and_bolt": "🔩",
- "gear": "⚙️",
- "clamp": "🗜️",
- "balance_scale": "⚖️",
- "probing_cane": "🦯",
- "link": "🔗",
- "chains": "⛓️",
- "hook": "🪝",
- "toolbox": "🧰",
- "magnet": "🧲",
- "ladder": "🪜",
- "alembic": "⚗️",
- "test_tube": "🧪",
- "petri_dish": "🧫",
- "dna": "🧬",
- "microscope": "🔬",
- "telescope": "🔭",
- "satellite": "📡",
- "syringe": "💉",
- "drop_of_blood": "🩸",
- "pill": "💊",
- "adhesive_bandage": "🩹",
- "crutch": "🩼",
- "stethoscope": "🩺",
- "x_ray": "🩻",
- "door": "🚪",
- "elevator": "🛗",
- "mirror": "🪞",
- "window": "🪟",
- "bed": "🛏️",
- "couch_and_lamp": "🛋️",
- "chair": "🪑",
- "toilet": "🚽",
- "plunger": "🪠",
- "shower": "🚿",
- "bathtub": "🛁",
- "mouse_trap": "🪤",
- "razor": "🪒",
- "lotion_bottle": "🧴",
- "safety_pin": "🧷",
- "broom": "🧹",
- "basket": "🧺",
- "roll_of_paper": "🧻",
- "bucket": "🪣",
- "soap": "🧼",
- "bubbles": "🫧",
- "toothbrush": "🪥",
- "sponge": "🧽",
- "fire_extinguisher": "🧯",
- "shopping_cart": "🛒",
- "smoking": "🚬",
- "coffin": "⚰️",
- "headstone": "🪦",
- "funeral_urn": "⚱️",
- "nazar_amulet": "🧿",
- "hamsa": "🪬",
- "moyai": "🗿",
- "placard": "🪧",
- "identification_card": "🪪",
- "atm": "🏧",
- "put_litter_in_its_place": "🚮",
- "potable_water": "🚰",
- "wheelchair": "♿",
- "mens": "🚹",
- "womens": "🚺",
- "restroom": "🚻",
- "baby_symbol": "🚼",
- "wc": "🚾",
- "passport_control": "🛂",
- "customs": "🛃",
- "baggage_claim": "🛄",
- "left_luggage": "🛅",
- "warning": "⚠️",
- "children_crossing": "🚸",
- "no_entry": "⛔",
- "no_entry_sign": "🚫",
- "no_bicycles": "🚳",
- "no_smoking": "🚭",
- "do_not_litter": "🚯",
- "non_potable_water": "🚱",
- "no_pedestrians": "🚷",
- "no_mobile_phones": "📵",
- "underage": "🔞",
- "radioactive": "☢️",
- "biohazard": "☣️",
- "arrow_up": "⬆️",
- "arrow_upper_right": "↗️",
- "arrow_right": "➡️",
- "arrow_lower_right": "↘️",
- "arrow_down": "⬇️",
- "arrow_lower_left": "↙️",
- "arrow_left": "⬅️",
- "arrow_upper_left": "↖️",
- "arrow_up_down": "↕️",
- "left_right_arrow": "↔️",
- "leftwards_arrow_with_hook": "↩️",
- "arrow_right_hook": "↪️",
- "arrow_heading_up": "⤴️",
- "arrow_heading_down": "⤵️",
- "arrows_clockwise": "🔃",
- "arrows_counterclockwise": "🔄",
- "back": "🔙",
- "end": "🔚",
- "on": "🔛",
- "soon": "🔜",
- "top": "🔝",
- "place_of_worship": "🛐",
- "atom_symbol": "⚛️",
- "om": "🕉️",
- "star_of_david": "✡️",
- "wheel_of_dharma": "☸️",
- "yin_yang": "☯️",
- "latin_cross": "✝️",
- "orthodox_cross": "☦️",
- "star_and_crescent": "☪️",
- "peace_symbol": "☮️",
- "menorah": "🕎",
- "six_pointed_star": "🔯",
- "khanda": "🪯",
- "aries": "♈",
- "taurus": "♉",
- "gemini": "♊",
- "cancer": "♋",
- "leo": "♌",
- "virgo": "♍",
- "libra": "♎",
- "scorpius": "♏",
- "sagittarius": "♐",
- "capricorn": "♑",
- "aquarius": "♒",
- "pisces": "♓",
- "ophiuchus": "⛎",
- "twisted_rightwards_arrows": "🔀",
- "repeat": "🔁",
- "repeat_one": "🔂",
- "arrow_forward": "▶️",
- "fast_forward": "⏩",
- "next_track_button": "⏭️",
- "play_or_pause_button": "⏯️",
- "arrow_backward": "◀️",
- "rewind": "⏪",
- "previous_track_button": "⏮️",
- "arrow_up_small": "🔼",
- "arrow_double_up": "⏫",
- "arrow_down_small": "🔽",
- "arrow_double_down": "⏬",
- "pause_button": "⏸️",
- "stop_button": "⏹️",
- "record_button": "⏺️",
- "eject_button": "⏏️",
- "cinema": "🎦",
- "low_brightness": "🔅",
- "high_brightness": "🔆",
- "signal_strength": "📶",
- "wireless": "🛜",
- "vibration_mode": "📳",
- "mobile_phone_off": "📴",
- "female_sign": "♀️",
- "male_sign": "♂️",
- "transgender_symbol": "⚧️",
- "heavy_multiplication_x": "✖️",
- "heavy_plus_sign": "➕",
- "heavy_minus_sign": "➖",
- "heavy_division_sign": "➗",
- "heavy_equals_sign": "🟰",
- "infinity": "♾️",
- "bangbang": "‼️",
- "interrobang": "⁉️",
- "question": "❓",
- "grey_question": "❔",
- "grey_exclamation": "❕",
- "exclamation": "❗",
- "heavy_exclamation_mark": "❗",
- "wavy_dash": "〰️",
- "currency_exchange": "💱",
- "heavy_dollar_sign": "💲",
- "medical_symbol": "⚕️",
- "recycle": "♻️",
- "fleur_de_lis": "⚜️",
- "trident": "🔱",
- "name_badge": "📛",
- "beginner": "🔰",
- "o": "⭕",
- "white_check_mark": "✅",
- "ballot_box_with_check": "☑️",
- "heavy_check_mark": "✔️",
- "x": "❌",
- "negative_squared_cross_mark": "❎",
- "curly_loop": "➰",
- "loop": "➿",
- "part_alternation_mark": "〽️",
- "eight_spoked_asterisk": "✳️",
- "eight_pointed_black_star": "✴️",
- "sparkle": "❇️",
- "copyright": "©️",
- "registered": "®️",
- "tm": "™️",
- "hash": "#️⃣",
- "asterisk": "*️⃣",
- "zero": "0️⃣",
- "one": "1️⃣",
- "two": "2️⃣",
- "three": "3️⃣",
- "four": "4️⃣",
- "five": "5️⃣",
- "six": "6️⃣",
- "seven": "7️⃣",
- "eight": "8️⃣",
- "nine": "9️⃣",
- "keycap_ten": "🔟",
- "capital_abcd": "🔠",
- "abcd": "🔡",
- "symbols": "🔣",
- "abc": "🔤",
- "a": "🅰️",
- "ab": "🆎",
- "b": "🅱️",
- "cl": "🆑",
- "cool": "🆒",
- "free": "🆓",
- "information_source": "ℹ️",
- "id": "🆔",
- "m": "Ⓜ️",
- "new": "🆕",
- "ng": "🆖",
- "o2": "🅾️",
- "ok": "🆗",
- "parking": "🅿️",
- "sos": "🆘",
- "up": "🆙",
- "vs": "🆚",
- "koko": "🈁",
- "sa": "🈂️",
- "u6708": "🈷️",
- "u6709": "🈶",
- "u6307": "🈯",
- "ideograph_advantage": "🉐",
- "u5272": "🈹",
- "u7121": "🈚",
- "u7981": "🈲",
- "accept": "🉑",
- "u7533": "🈸",
- "u5408": "🈴",
- "u7a7a": "🈳",
- "congratulations": "㊗️",
- "secret": "㊙️",
- "u55b6": "🈺",
- "u6e80": "🈵",
- "red_circle": "🔴",
- "orange_circle": "🟠",
- "yellow_circle": "🟡",
- "green_circle": "🟢",
- "large_blue_circle": "🔵",
- "purple_circle": "🟣",
- "brown_circle": "🟤",
- "black_circle": "⚫",
- "white_circle": "⚪",
- "red_square": "🟥",
- "orange_square": "🟧",
- "yellow_square": "🟨",
- "green_square": "🟩",
- "blue_square": "🟦",
- "purple_square": "🟪",
- "brown_square": "🟫",
- "black_large_square": "⬛",
- "white_large_square": "⬜",
- "black_medium_square": "◼️",
- "white_medium_square": "◻️",
- "black_medium_small_square": "◾",
- "white_medium_small_square": "◽",
- "black_small_square": "▪️",
- "white_small_square": "▫️",
- "large_orange_diamond": "🔶",
- "large_blue_diamond": "🔷",
- "small_orange_diamond": "🔸",
- "small_blue_diamond": "🔹",
- "small_red_triangle": "🔺",
- "small_red_triangle_down": "🔻",
- "diamond_shape_with_a_dot_inside": "💠",
- "radio_button": "🔘",
- "white_square_button": "🔳",
- "black_square_button": "🔲",
- "checkered_flag": "🏁",
- "triangular_flag_on_post": "🚩",
- "crossed_flags": "🎌",
- "black_flag": "🏴",
- "white_flag": "🏳️",
- "rainbow_flag": "🏳️🌈",
- "transgender_flag": "🏳️⚧️",
- "pirate_flag": "🏴☠️",
- "ascension_island": "🇦🇨",
- "andorra": "🇦🇩",
- "united_arab_emirates": "🇦🇪",
- "afghanistan": "🇦🇫",
- "antigua_barbuda": "🇦🇬",
- "anguilla": "🇦🇮",
- "albania": "🇦🇱",
- "armenia": "🇦🇲",
- "angola": "🇦🇴",
- "antarctica": "🇦🇶",
- "argentina": "🇦🇷",
- "american_samoa": "🇦🇸",
- "austria": "🇦🇹",
- "australia": "🇦🇺",
- "aruba": "🇦🇼",
- "aland_islands": "🇦🇽",
- "azerbaijan": "🇦🇿",
- "bosnia_herzegovina": "🇧🇦",
- "barbados": "🇧🇧",
- "bangladesh": "🇧🇩",
- "belgium": "🇧🇪",
- "burkina_faso": "🇧🇫",
- "bulgaria": "🇧🇬",
- "bahrain": "🇧🇭",
- "burundi": "🇧🇮",
- "benin": "🇧🇯",
- "st_barthelemy": "🇧🇱",
- "bermuda": "🇧🇲",
- "brunei": "🇧🇳",
- "bolivia": "🇧🇴",
- "caribbean_netherlands": "🇧🇶",
- "brazil": "🇧🇷",
- "bahamas": "🇧🇸",
- "bhutan": "🇧🇹",
- "bouvet_island": "🇧🇻",
- "botswana": "🇧🇼",
- "belarus": "🇧🇾",
- "belize": "🇧🇿",
- "canada": "🇨🇦",
- "cocos_islands": "🇨🇨",
- "congo_kinshasa": "🇨🇩",
- "central_african_republic": "🇨🇫",
- "congo_brazzaville": "🇨🇬",
- "switzerland": "🇨🇭",
- "cote_divoire": "🇨🇮",
- "cook_islands": "🇨🇰",
- "chile": "🇨🇱",
- "cameroon": "🇨🇲",
- "cn": "🇨🇳",
- "colombia": "🇨🇴",
- "clipperton_island": "🇨🇵",
- "costa_rica": "🇨🇷",
- "cuba": "🇨🇺",
- "cape_verde": "🇨🇻",
- "curacao": "🇨🇼",
- "christmas_island": "🇨🇽",
- "cyprus": "🇨🇾",
- "czech_republic": "🇨🇿",
- "de": "🇩🇪",
- "diego_garcia": "🇩🇬",
- "djibouti": "🇩🇯",
- "denmark": "🇩🇰",
- "dominica": "🇩🇲",
- "dominican_republic": "🇩🇴",
- "algeria": "🇩🇿",
- "ceuta_melilla": "🇪🇦",
- "ecuador": "🇪🇨",
- "estonia": "🇪🇪",
- "egypt": "🇪🇬",
- "western_sahara": "🇪🇭",
- "eritrea": "🇪🇷",
- "es": "🇪🇸",
- "ethiopia": "🇪🇹",
- "eu": "🇪🇺",
- "european_union": "🇪🇺",
- "finland": "🇫🇮",
- "fiji": "🇫🇯",
- "falkland_islands": "🇫🇰",
- "micronesia": "🇫🇲",
- "faroe_islands": "🇫🇴",
- "fr": "🇫🇷",
- "gabon": "🇬🇦",
- "gb": "🇬🇧",
- "uk": "🇬🇧",
- "grenada": "🇬🇩",
- "georgia": "🇬🇪",
- "french_guiana": "🇬🇫",
- "guernsey": "🇬🇬",
- "ghana": "🇬🇭",
- "gibraltar": "🇬🇮",
- "greenland": "🇬🇱",
- "gambia": "🇬🇲",
- "guinea": "🇬🇳",
- "guadeloupe": "🇬🇵",
- "equatorial_guinea": "🇬🇶",
- "greece": "🇬🇷",
- "south_georgia_south_sandwich_islands": "🇬🇸",
- "guatemala": "🇬🇹",
- "guam": "🇬🇺",
- "guinea_bissau": "🇬🇼",
- "guyana": "🇬🇾",
- "hong_kong": "🇭🇰",
- "heard_mcdonald_islands": "🇭🇲",
- "honduras": "🇭🇳",
- "croatia": "🇭🇷",
- "haiti": "🇭🇹",
- "hungary": "🇭🇺",
- "canary_islands": "🇮🇨",
- "indonesia": "🇮🇩",
- "ireland": "🇮🇪",
- "israel": "🇮🇱",
- "isle_of_man": "🇮🇲",
- "india": "🇮🇳",
- "british_indian_ocean_territory": "🇮🇴",
- "iraq": "🇮🇶",
- "iran": "🇮🇷",
- "iceland": "🇮🇸",
- "it": "🇮🇹",
- "jersey": "🇯🇪",
- "jamaica": "🇯🇲",
- "jordan": "🇯🇴",
- "jp": "🇯🇵",
- "kenya": "🇰🇪",
- "kyrgyzstan": "🇰🇬",
- "cambodia": "🇰🇭",
- "kiribati": "🇰🇮",
- "comoros": "🇰🇲",
- "st_kitts_nevis": "🇰🇳",
- "north_korea": "🇰🇵",
- "kr": "🇰🇷",
- "kuwait": "🇰🇼",
- "cayman_islands": "🇰🇾",
- "kazakhstan": "🇰🇿",
- "laos": "🇱🇦",
- "lebanon": "🇱🇧",
- "st_lucia": "🇱🇨",
- "liechtenstein": "🇱🇮",
- "sri_lanka": "🇱🇰",
- "liberia": "🇱🇷",
- "lesotho": "🇱🇸",
- "lithuania": "🇱🇹",
- "luxembourg": "🇱🇺",
- "latvia": "🇱🇻",
- "libya": "🇱🇾",
- "morocco": "🇲🇦",
- "monaco": "🇲🇨",
- "moldova": "🇲🇩",
- "montenegro": "🇲🇪",
- "st_martin": "🇲🇫",
- "madagascar": "🇲🇬",
- "marshall_islands": "🇲🇭",
- "macedonia": "🇲🇰",
- "mali": "🇲🇱",
- "myanmar": "🇲🇲",
- "mongolia": "🇲🇳",
- "macau": "🇲🇴",
- "northern_mariana_islands": "🇲🇵",
- "martinique": "🇲🇶",
- "mauritania": "🇲🇷",
- "montserrat": "🇲🇸",
- "malta": "🇲🇹",
- "mauritius": "🇲🇺",
- "maldives": "🇲🇻",
- "malawi": "🇲🇼",
- "mexico": "🇲🇽",
- "malaysia": "🇲🇾",
- "mozambique": "🇲🇿",
- "namibia": "🇳🇦",
- "new_caledonia": "🇳🇨",
- "niger": "🇳🇪",
- "norfolk_island": "🇳🇫",
- "nigeria": "🇳🇬",
- "nicaragua": "🇳🇮",
- "netherlands": "🇳🇱",
- "norway": "🇳🇴",
- "nepal": "🇳🇵",
- "nauru": "🇳🇷",
- "niue": "🇳🇺",
- "new_zealand": "🇳🇿",
- "oman": "🇴🇲",
- "panama": "🇵🇦",
- "peru": "🇵🇪",
- "french_polynesia": "🇵🇫",
- "papua_new_guinea": "🇵🇬",
- "philippines": "🇵🇭",
- "pakistan": "🇵🇰",
- "poland": "🇵🇱",
- "st_pierre_miquelon": "🇵🇲",
- "pitcairn_islands": "🇵🇳",
- "puerto_rico": "🇵🇷",
- "palestinian_territories": "🇵🇸",
- "portugal": "🇵🇹",
- "palau": "🇵🇼",
- "paraguay": "🇵🇾",
- "qatar": "🇶🇦",
- "reunion": "🇷🇪",
- "romania": "🇷🇴",
- "serbia": "🇷🇸",
- "ru": "🇷🇺",
- "rwanda": "🇷🇼",
- "saudi_arabia": "🇸🇦",
- "solomon_islands": "🇸🇧",
- "seychelles": "🇸🇨",
- "sudan": "🇸🇩",
- "sweden": "🇸🇪",
- "singapore": "🇸🇬",
- "st_helena": "🇸🇭",
- "slovenia": "🇸🇮",
- "svalbard_jan_mayen": "🇸🇯",
- "slovakia": "🇸🇰",
- "sierra_leone": "🇸🇱",
- "san_marino": "🇸🇲",
- "senegal": "🇸🇳",
- "somalia": "🇸🇴",
- "suriname": "🇸🇷",
- "south_sudan": "🇸🇸",
- "sao_tome_principe": "🇸🇹",
- "el_salvador": "🇸🇻",
- "sint_maarten": "🇸🇽",
- "syria": "🇸🇾",
- "swaziland": "🇸🇿",
- "tristan_da_cunha": "🇹🇦",
- "turks_caicos_islands": "🇹🇨",
- "chad": "🇹🇩",
- "french_southern_territories": "🇹🇫",
- "togo": "🇹🇬",
- "thailand": "🇹🇭",
- "tajikistan": "🇹🇯",
- "tokelau": "🇹🇰",
- "timor_leste": "🇹🇱",
- "turkmenistan": "🇹🇲",
- "tunisia": "🇹🇳",
- "tonga": "🇹🇴",
- "tr": "🇹🇷",
- "trinidad_tobago": "🇹🇹",
- "tuvalu": "🇹🇻",
- "taiwan": "🇹🇼",
- "tanzania": "🇹🇿",
- "ukraine": "🇺🇦",
- "uganda": "🇺🇬",
- "us_outlying_islands": "🇺🇲",
- "united_nations": "🇺🇳",
- "us": "🇺🇸",
- "uruguay": "🇺🇾",
- "uzbekistan": "🇺🇿",
- "vatican_city": "🇻🇦",
- "st_vincent_grenadines": "🇻🇨",
- "venezuela": "🇻🇪",
- "british_virgin_islands": "🇻🇬",
- "us_virgin_islands": "🇻🇮",
- "vietnam": "🇻🇳",
- "vanuatu": "🇻🇺",
- "wallis_futuna": "🇼🇫",
- "samoa": "🇼🇸",
- "kosovo": "🇽🇰",
- "yemen": "🇾🇪",
- "mayotte": "🇾🇹",
- "south_africa": "🇿🇦",
- "zambia": "🇿🇲",
- "zimbabwe": "🇿🇼",
- "england": "🏴",
- "scotland": "🏴",
- "wales": "🏴"
-}
diff --git a/client/js/hooks/use-close-channel.ts b/client/js/hooks/use-close-channel.ts
deleted file mode 100644
index 8c6cd3f0..00000000
--- a/client/js/hooks/use-close-channel.ts
+++ /dev/null
@@ -1,39 +0,0 @@
-import eventbus from "../eventbus";
-import socket from "../socket";
-import {ClientChan} from "../types";
-import {ChanType} from "../../../shared/types/chan";
-
-export default function useCloseChannel(channel: ClientChan) {
- return () => {
- if (channel.type === ChanType.LOBBY) {
- eventbus.emit(
- "confirm-dialog",
- {
- title: "Remove network",
- text: `Are you sure you want to quit and remove ${channel.name}? This cannot be undone.`,
- button: "Remove network",
- },
- (result: boolean) => {
- if (!result) {
- return;
- }
-
- channel.closed = true;
- socket.emit("input", {
- target: Number(channel.id),
- text: "/quit",
- });
- }
- );
-
- return;
- }
-
- channel.closed = true;
-
- socket.emit("input", {
- target: Number(channel.id),
- text: "/close",
- });
- };
-}
diff --git a/client/js/keybinds.ts b/client/js/keybinds.ts
deleted file mode 100644
index 34615ef3..00000000
--- a/client/js/keybinds.ts
+++ /dev/null
@@ -1,259 +0,0 @@
-import Mousetrap from "mousetrap";
-
-import {store} from "./store";
-import {switchToChannel, router, navigate} from "./router";
-import isChannelCollapsed from "./helpers/isChannelCollapsed";
-import isIgnoredKeybind from "./helpers/isIgnoredKeybind";
-import listenForTwoFingerSwipes from "./helpers/listenForTwoFingerSwipes";
-import {ClientChan} from "./types";
-import {ChanType} from "../../shared/types/chan";
-
-// Switch to the next/previous window in the channel list.
-Mousetrap.bind(["alt+up", "alt+down"], function (e, keys) {
- if (isIgnoredKeybind(e)) {
- return true;
- }
-
- navigateWindow(keys.split("+").pop() === "up" ? -1 : 1);
-
- return false;
-});
-
-listenForTwoFingerSwipes(function (cardinalDirection: string) {
- if (cardinalDirection === "e" || cardinalDirection === "w") {
- navigateWindow(cardinalDirection === "e" ? -1 : 1);
- }
-});
-
-function navigateWindow(direction: number) {
- if (store.state.networks.length === 0) {
- return;
- }
-
- const flatChannels: ClientChan[] = [];
- let index = -1;
-
- for (const network of store.state.networks) {
- for (const channel of network.channels) {
- if (isChannelCollapsed(network, channel)) {
- continue;
- }
-
- if (index === -1 && store.state.activeChannel?.channel === channel) {
- index = flatChannels.length;
- }
-
- flatChannels.push(channel);
- }
- }
-
- // Circular array, and a modulo bug workaround because in JS it stays negative
- const length = flatChannels.length;
- index = (((index + direction) % length) + length) % length;
-
- jumpToChannel(flatChannels[index]);
-}
-
-// Switch to the next/previous lobby in the channel list
-Mousetrap.bind(["alt+shift+up", "alt+shift+down"], function (e, keys) {
- if (isIgnoredKeybind(e)) {
- return true;
- }
-
- const length = store.state.networks.length;
-
- if (length === 0) {
- return false;
- }
-
- const direction = keys.split("+").pop() === "up" ? -1 : 1;
- let index = 0;
-
- // If we're in another window, jump to first lobby
- if (store.state.activeChannel) {
- index = store.state.networks.findIndex((n) => n === store.state.activeChannel?.network);
-
- // If we're in a channel, and it's not the lobby, jump to lobby of this network when going up
- if (direction !== -1 || store.state.activeChannel?.channel.type === ChanType.LOBBY) {
- index = (((index + direction) % length) + length) % length;
- }
- }
-
- jumpToChannel(store.state.networks[index].channels[0]);
-
- return false;
-});
-
-// Switch to the next/previous unread chat
-Mousetrap.bind(["alt+mod+up", "alt+mod+down"], function (e, keys) {
- if (isIgnoredKeybind(e)) {
- return true;
- }
-
- const channels = store.state.networks
- .map((net) =>
- net.channels.filter(
- (chan) => chan.unread || chan === store.state.activeChannel?.channel
- )
- )
- .flat();
-
- if (channels.length === 0) {
- return;
- }
-
- let index = channels.findIndex((chan) => chan === store.state.activeChannel?.channel);
-
- const length = channels.length;
- const direction = keys.split("+").pop() === "up" ? -1 : 1;
- index = (((index + direction) % length) + length) % length;
-
- jumpToChannel(channels[index]);
-
- return false;
-});
-
-// Jump to the first window with a highlight in it, or the first with unread
-// activity if there are none with highlights.
-Mousetrap.bind(["alt+a"], function (e) {
- if (isIgnoredKeybind(e)) {
- return true;
- }
-
- let targetChannel;
-
- outer_loop: for (const network of store.state.networks) {
- for (const chan of network.channels) {
- if (chan.highlight) {
- targetChannel = chan;
- break outer_loop;
- }
-
- if (chan.unread && !targetChannel) {
- targetChannel = chan;
- }
- }
- }
-
- if (targetChannel) {
- jumpToChannel(targetChannel);
- }
-
- return false;
-});
-
-// Show the help menu.
-Mousetrap.bind(["alt+/"], function (e) {
- if (isIgnoredKeybind(e)) {
- return true;
- }
-
- /* eslint-disable no-console */
- navigate("Help").catch((err) => console.log(err));
- return false;
-});
-
-function jumpToChannel(targetChannel: ClientChan) {
- switchToChannel(targetChannel);
-
- const element = document.querySelector(
- `#sidebar .channel-list-item[aria-controls="#chan-${targetChannel.id}"]`
- );
-
- if (element) {
- scrollIntoViewNicely(element);
- }
-}
-
-// Ignored keys which should not automatically focus the input bar
-const ignoredKeys = {
- 8: true, // Backspace
- 9: true, // Tab
- 12: true, // Clear
- 16: true, // Shift
- 17: true, // Control
- 18: true, // Alt
- 19: true, // Pause
- 20: true, // CapsLock
- 27: true, // Escape
- 35: true, // End
- 36: true, // Home
- 37: true, // ArrowLeft
- 38: true, // ArrowUp
- 39: true, // ArrowRight
- 40: true, // ArrowDown
- 45: true, // Insert
- 46: true, // Delete
- 112: true, // F1
- 113: true, // F2
- 114: true, // F3
- 115: true, // F4
- 116: true, // F5
- 117: true, // F6
- 118: true, // F7
- 119: true, // F8
- 120: true, // F9
- 121: true, // F10
- 122: true, // F11
- 123: true, // F12
- 144: true, // NumLock
- 145: true, // ScrollLock
- 224: true, // Meta
-};
-
-document.addEventListener("keydown", (e) => {
- // Allow navigating back to the previous page when on the help screen.
- if (e.key === "Escape" && router.currentRoute.value.name === "Help") {
- router.go(-1);
- return;
- }
-
- // Ignore any key that uses alt modifier
- // Ignore keys defined above
- if (e.altKey || ignoredKeys[e.which]) {
- return;
- }
-
- // Ignore all ctrl keys except for ctrl+v to allow pasting
- if ((e.ctrlKey || e.metaKey) && e.which !== 86) {
- return;
- }
-
- // Redirect pagedown/pageup keys to messages container so it scrolls
- if (e.which === 33 || e.which === 34) {
- const chat = document.querySelector(".window .chat-content .chat");
-
- if (chat) {
- (chat as HTMLDivElement).focus();
- }
-
- return;
- }
-
- const tagName = (e.target as HTMLElement).tagName;
-
- // Ignore if we're already typing into or
- if (tagName === "INPUT" || tagName === "TEXTAREA") {
- return;
- }
-
- const input = document.getElementById("input");
-
- if (!input) {
- return;
- }
-
- input.focus();
-
- // On enter, focus the input but do not propagate the event
- // This way, a new line is not inserted
- if (e.which === 13) {
- e.preventDefault();
- }
-});
-
-function scrollIntoViewNicely(el) {
- // Ideally this would use behavior: "smooth", but that does not consistently work in e.g. Chrome
- // https://github.com/iamdustan/smoothscroll/issues/28#issuecomment-364061459
- el.scrollIntoView({block: "center", inline: "nearest"});
-}
diff --git a/client/js/libs/handlebars.js b/client/js/libs/handlebars.js
new file mode 100644
index 00000000..8c495a51
--- /dev/null
+++ b/client/js/libs/handlebars.js
@@ -0,0 +1,1240 @@
+/*!
+
+ handlebars v4.0.5
+
+Copyright (C) 2011-2015 by Yehuda Katz
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+@license
+*/
+(function webpackUniversalModuleDefinition(root, factory) {
+ if(typeof exports === 'object' && typeof module === 'object')
+ module.exports = factory();
+ else if(typeof define === 'function' && define.amd)
+ define([], factory);
+ else if(typeof exports === 'object')
+ exports["Handlebars"] = factory();
+ else
+ root["Handlebars"] = factory();
+})(this, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId])
+/******/ return installedModules[moduleId].exports;
+
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ exports: {},
+/******/ id: moduleId,
+/******/ loaded: false
+/******/ };
+
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+
+/******/ // Flag the module as loaded
+/******/ module.loaded = true;
+
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+
+
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ function(module, exports, __webpack_require__) {
+
+ 'use strict';
+
+ var _interopRequireWildcard = __webpack_require__(1)['default'];
+
+ var _interopRequireDefault = __webpack_require__(2)['default'];
+
+ exports.__esModule = true;
+
+ var _handlebarsBase = __webpack_require__(3);
+
+ var base = _interopRequireWildcard(_handlebarsBase);
+
+ // Each of these augment the Handlebars object. No need to setup here.
+ // (This is done to easily share code between commonjs and browse envs)
+
+ var _handlebarsSafeString = __webpack_require__(17);
+
+ var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);
+
+ var _handlebarsException = __webpack_require__(5);
+
+ var _handlebarsException2 = _interopRequireDefault(_handlebarsException);
+
+ var _handlebarsUtils = __webpack_require__(4);
+
+ var Utils = _interopRequireWildcard(_handlebarsUtils);
+
+ var _handlebarsRuntime = __webpack_require__(18);
+
+ var runtime = _interopRequireWildcard(_handlebarsRuntime);
+
+ var _handlebarsNoConflict = __webpack_require__(19);
+
+ var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);
+
+ // For compatibility and usage outside of module systems, make the Handlebars object a namespace
+ function create() {
+ var hb = new base.HandlebarsEnvironment();
+
+ Utils.extend(hb, base);
+ hb.SafeString = _handlebarsSafeString2['default'];
+ hb.Exception = _handlebarsException2['default'];
+ hb.Utils = Utils;
+ hb.escapeExpression = Utils.escapeExpression;
+
+ hb.VM = runtime;
+ hb.template = function (spec) {
+ return runtime.template(spec, hb);
+ };
+
+ return hb;
+ }
+
+ var inst = create();
+ inst.create = create;
+
+ _handlebarsNoConflict2['default'](inst);
+
+ inst['default'] = inst;
+
+ exports['default'] = inst;
+ module.exports = exports['default'];
+
+/***/ },
+/* 1 */
+/***/ function(module, exports) {
+
+ "use strict";
+
+ exports["default"] = function (obj) {
+ if (obj && obj.__esModule) {
+ return obj;
+ } else {
+ var newObj = {};
+
+ if (obj != null) {
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
+ }
+ }
+
+ newObj["default"] = obj;
+ return newObj;
+ }
+ };
+
+ exports.__esModule = true;
+
+/***/ },
+/* 2 */
+/***/ function(module, exports) {
+
+ "use strict";
+
+ exports["default"] = function (obj) {
+ return obj && obj.__esModule ? obj : {
+ "default": obj
+ };
+ };
+
+ exports.__esModule = true;
+
+/***/ },
+/* 3 */
+/***/ function(module, exports, __webpack_require__) {
+
+ 'use strict';
+
+ var _interopRequireDefault = __webpack_require__(2)['default'];
+
+ exports.__esModule = true;
+ exports.HandlebarsEnvironment = HandlebarsEnvironment;
+
+ var _utils = __webpack_require__(4);
+
+ var _exception = __webpack_require__(5);
+
+ var _exception2 = _interopRequireDefault(_exception);
+
+ var _helpers = __webpack_require__(6);
+
+ var _decorators = __webpack_require__(14);
+
+ var _logger = __webpack_require__(16);
+
+ var _logger2 = _interopRequireDefault(_logger);
+
+ var VERSION = '4.0.5';
+ exports.VERSION = VERSION;
+ var COMPILER_REVISION = 7;
+
+ exports.COMPILER_REVISION = COMPILER_REVISION;
+ var REVISION_CHANGES = {
+ 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it
+ 2: '== 1.0.0-rc.3',
+ 3: '== 1.0.0-rc.4',
+ 4: '== 1.x.x',
+ 5: '== 2.0.0-alpha.x',
+ 6: '>= 2.0.0-beta.1',
+ 7: '>= 4.0.0'
+ };
+
+ exports.REVISION_CHANGES = REVISION_CHANGES;
+ var objectType = '[object Object]';
+
+ function HandlebarsEnvironment(helpers, partials, decorators) {
+ this.helpers = helpers || {};
+ this.partials = partials || {};
+ this.decorators = decorators || {};
+
+ _helpers.registerDefaultHelpers(this);
+ _decorators.registerDefaultDecorators(this);
+ }
+
+ HandlebarsEnvironment.prototype = {
+ constructor: HandlebarsEnvironment,
+
+ logger: _logger2['default'],
+ log: _logger2['default'].log,
+
+ registerHelper: function registerHelper(name, fn) {
+ if (_utils.toString.call(name) === objectType) {
+ if (fn) {
+ throw new _exception2['default']('Arg not supported with multiple helpers');
+ }
+ _utils.extend(this.helpers, name);
+ } else {
+ this.helpers[name] = fn;
+ }
+ },
+ unregisterHelper: function unregisterHelper(name) {
+ delete this.helpers[name];
+ },
+
+ registerPartial: function registerPartial(name, partial) {
+ if (_utils.toString.call(name) === objectType) {
+ _utils.extend(this.partials, name);
+ } else {
+ if (typeof partial === 'undefined') {
+ throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined');
+ }
+ this.partials[name] = partial;
+ }
+ },
+ unregisterPartial: function unregisterPartial(name) {
+ delete this.partials[name];
+ },
+
+ registerDecorator: function registerDecorator(name, fn) {
+ if (_utils.toString.call(name) === objectType) {
+ if (fn) {
+ throw new _exception2['default']('Arg not supported with multiple decorators');
+ }
+ _utils.extend(this.decorators, name);
+ } else {
+ this.decorators[name] = fn;
+ }
+ },
+ unregisterDecorator: function unregisterDecorator(name) {
+ delete this.decorators[name];
+ }
+ };
+
+ var log = _logger2['default'].log;
+
+ exports.log = log;
+ exports.createFrame = _utils.createFrame;
+ exports.logger = _logger2['default'];
+
+/***/ },
+/* 4 */
+/***/ function(module, exports) {
+
+ 'use strict';
+
+ exports.__esModule = true;
+ exports.extend = extend;
+ exports.indexOf = indexOf;
+ exports.escapeExpression = escapeExpression;
+ exports.isEmpty = isEmpty;
+ exports.createFrame = createFrame;
+ exports.blockParams = blockParams;
+ exports.appendContextPath = appendContextPath;
+ var escape = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '`': '`',
+ '=': '='
+ };
+
+ var badChars = /[&<>"'`=]/g,
+ possible = /[&<>"'`=]/;
+
+ function escapeChar(chr) {
+ return escape[chr];
+ }
+
+ function extend(obj /* , ...source */) {
+ for (var i = 1; i < arguments.length; i++) {
+ for (var key in arguments[i]) {
+ if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
+ obj[key] = arguments[i][key];
+ }
+ }
+ }
+
+ return obj;
+ }
+
+ var toString = Object.prototype.toString;
+
+ exports.toString = toString;
+ // Sourced from lodash
+ // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
+ /* eslint-disable func-style */
+ var isFunction = function isFunction(value) {
+ return typeof value === 'function';
+ };
+ // fallback for older versions of Chrome and Safari
+ /* istanbul ignore next */
+ if (isFunction(/x/)) {
+ exports.isFunction = isFunction = function (value) {
+ return typeof value === 'function' && toString.call(value) === '[object Function]';
+ };
+ }
+ exports.isFunction = isFunction;
+
+ /* eslint-enable func-style */
+
+ /* istanbul ignore next */
+ var isArray = Array.isArray || function (value) {
+ return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;
+ };
+
+ exports.isArray = isArray;
+ // Older IE versions do not directly support indexOf so we must implement our own, sadly.
+
+ function indexOf(array, value) {
+ for (var i = 0, len = array.length; i < len; i++) {
+ if (array[i] === value) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ function escapeExpression(string) {
+ if (typeof string !== 'string') {
+ // don't escape SafeStrings, since they're already safe
+ if (string && string.toHTML) {
+ return string.toHTML();
+ } else if (string == null) {
+ return '';
+ } else if (!string) {
+ return string + '';
+ }
+
+ // Force a string conversion as this will be done by the append regardless and
+ // the regex test will do this transparently behind the scenes, causing issues if
+ // an object's to string has escaped characters in it.
+ string = '' + string;
+ }
+
+ if (!possible.test(string)) {
+ return string;
+ }
+ return string.replace(badChars, escapeChar);
+ }
+
+ function isEmpty(value) {
+ if (!value && value !== 0) {
+ return true;
+ } else if (isArray(value) && value.length === 0) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ function createFrame(object) {
+ var frame = extend({}, object);
+ frame._parent = object;
+ return frame;
+ }
+
+ function blockParams(params, ids) {
+ params.path = ids;
+ return params;
+ }
+
+ function appendContextPath(contextPath, id) {
+ return (contextPath ? contextPath + '.' : '') + id;
+ }
+
+/***/ },
+/* 5 */
+/***/ function(module, exports) {
+
+ 'use strict';
+
+ exports.__esModule = true;
+
+ var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
+
+ function Exception(message, node) {
+ var loc = node && node.loc,
+ line = undefined,
+ column = undefined;
+ if (loc) {
+ line = loc.start.line;
+ column = loc.start.column;
+
+ message += ' - ' + line + ':' + column;
+ }
+
+ var tmp = Error.prototype.constructor.call(this, message);
+
+ // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
+ for (var idx = 0; idx < errorProps.length; idx++) {
+ this[errorProps[idx]] = tmp[errorProps[idx]];
+ }
+
+ /* istanbul ignore else */
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, Exception);
+ }
+
+ if (loc) {
+ this.lineNumber = line;
+ this.column = column;
+ }
+ }
+
+ Exception.prototype = new Error();
+
+ exports['default'] = Exception;
+ module.exports = exports['default'];
+
+/***/ },
+/* 6 */
+/***/ function(module, exports, __webpack_require__) {
+
+ 'use strict';
+
+ var _interopRequireDefault = __webpack_require__(2)['default'];
+
+ exports.__esModule = true;
+ exports.registerDefaultHelpers = registerDefaultHelpers;
+
+ var _helpersBlockHelperMissing = __webpack_require__(7);
+
+ var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);
+
+ var _helpersEach = __webpack_require__(8);
+
+ var _helpersEach2 = _interopRequireDefault(_helpersEach);
+
+ var _helpersHelperMissing = __webpack_require__(9);
+
+ var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);
+
+ var _helpersIf = __webpack_require__(10);
+
+ var _helpersIf2 = _interopRequireDefault(_helpersIf);
+
+ var _helpersLog = __webpack_require__(11);
+
+ var _helpersLog2 = _interopRequireDefault(_helpersLog);
+
+ var _helpersLookup = __webpack_require__(12);
+
+ var _helpersLookup2 = _interopRequireDefault(_helpersLookup);
+
+ var _helpersWith = __webpack_require__(13);
+
+ var _helpersWith2 = _interopRequireDefault(_helpersWith);
+
+ function registerDefaultHelpers(instance) {
+ _helpersBlockHelperMissing2['default'](instance);
+ _helpersEach2['default'](instance);
+ _helpersHelperMissing2['default'](instance);
+ _helpersIf2['default'](instance);
+ _helpersLog2['default'](instance);
+ _helpersLookup2['default'](instance);
+ _helpersWith2['default'](instance);
+ }
+
+/***/ },
+/* 7 */
+/***/ function(module, exports, __webpack_require__) {
+
+ 'use strict';
+
+ exports.__esModule = true;
+
+ var _utils = __webpack_require__(4);
+
+ exports['default'] = function (instance) {
+ instance.registerHelper('blockHelperMissing', function (context, options) {
+ var inverse = options.inverse,
+ fn = options.fn;
+
+ if (context === true) {
+ return fn(this);
+ } else if (context === false || context == null) {
+ return inverse(this);
+ } else if (_utils.isArray(context)) {
+ if (context.length > 0) {
+ if (options.ids) {
+ options.ids = [options.name];
+ }
+
+ return instance.helpers.each(context, options);
+ } else {
+ return inverse(this);
+ }
+ } else {
+ if (options.data && options.ids) {
+ var data = _utils.createFrame(options.data);
+ data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);
+ options = { data: data };
+ }
+
+ return fn(context, options);
+ }
+ });
+ };
+
+ module.exports = exports['default'];
+
+/***/ },
+/* 8 */
+/***/ function(module, exports, __webpack_require__) {
+
+ 'use strict';
+
+ var _interopRequireDefault = __webpack_require__(2)['default'];
+
+ exports.__esModule = true;
+
+ var _utils = __webpack_require__(4);
+
+ var _exception = __webpack_require__(5);
+
+ var _exception2 = _interopRequireDefault(_exception);
+
+ exports['default'] = function (instance) {
+ instance.registerHelper('each', function (context, options) {
+ if (!options) {
+ throw new _exception2['default']('Must pass iterator to #each');
+ }
+
+ var fn = options.fn,
+ inverse = options.inverse,
+ i = 0,
+ ret = '',
+ data = undefined,
+ contextPath = undefined;
+
+ if (options.data && options.ids) {
+ contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';
+ }
+
+ if (_utils.isFunction(context)) {
+ context = context.call(this);
+ }
+
+ if (options.data) {
+ data = _utils.createFrame(options.data);
+ }
+
+ function execIteration(field, index, last) {
+ if (data) {
+ data.key = field;
+ data.index = index;
+ data.first = index === 0;
+ data.last = !!last;
+
+ if (contextPath) {
+ data.contextPath = contextPath + field;
+ }
+ }
+
+ ret = ret + fn(context[field], {
+ data: data,
+ blockParams: _utils.blockParams([context[field], field], [contextPath + field, null])
+ });
+ }
+
+ if (context && typeof context === 'object') {
+ if (_utils.isArray(context)) {
+ for (var j = context.length; i < j; i++) {
+ if (i in context) {
+ execIteration(i, i, i === context.length - 1);
+ }
+ }
+ } else {
+ var priorKey = undefined;
+
+ for (var key in context) {
+ if (context.hasOwnProperty(key)) {
+ // We're running the iterations one step out of sync so we can detect
+ // the last iteration without have to scan the object twice and create
+ // an itermediate keys array.
+ if (priorKey !== undefined) {
+ execIteration(priorKey, i - 1);
+ }
+ priorKey = key;
+ i++;
+ }
+ }
+ if (priorKey !== undefined) {
+ execIteration(priorKey, i - 1, true);
+ }
+ }
+ }
+
+ if (i === 0) {
+ ret = inverse(this);
+ }
+
+ return ret;
+ });
+ };
+
+ module.exports = exports['default'];
+
+/***/ },
+/* 9 */
+/***/ function(module, exports, __webpack_require__) {
+
+ 'use strict';
+
+ var _interopRequireDefault = __webpack_require__(2)['default'];
+
+ exports.__esModule = true;
+
+ var _exception = __webpack_require__(5);
+
+ var _exception2 = _interopRequireDefault(_exception);
+
+ exports['default'] = function (instance) {
+ instance.registerHelper('helperMissing', function () /* [args, ]options */{
+ if (arguments.length === 1) {
+ // A missing field in a {{foo}} construct.
+ return undefined;
+ } else {
+ // Someone is actually trying to call something, blow up.
+ throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"');
+ }
+ });
+ };
+
+ module.exports = exports['default'];
+
+/***/ },
+/* 10 */
+/***/ function(module, exports, __webpack_require__) {
+
+ 'use strict';
+
+ exports.__esModule = true;
+
+ var _utils = __webpack_require__(4);
+
+ exports['default'] = function (instance) {
+ instance.registerHelper('if', function (conditional, options) {
+ if (_utils.isFunction(conditional)) {
+ conditional = conditional.call(this);
+ }
+
+ // Default behavior is to render the positive path if the value is truthy and not empty.
+ // The `includeZero` option may be set to treat the condtional as purely not empty based on the
+ // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.
+ if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {
+ return options.inverse(this);
+ } else {
+ return options.fn(this);
+ }
+ });
+
+ instance.registerHelper('unless', function (conditional, options) {
+ return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });
+ });
+ };
+
+ module.exports = exports['default'];
+
+/***/ },
+/* 11 */
+/***/ function(module, exports) {
+
+ 'use strict';
+
+ exports.__esModule = true;
+
+ exports['default'] = function (instance) {
+ instance.registerHelper('log', function () /* message, options */{
+ var args = [undefined],
+ options = arguments[arguments.length - 1];
+ for (var i = 0; i < arguments.length - 1; i++) {
+ args.push(arguments[i]);
+ }
+
+ var level = 1;
+ if (options.hash.level != null) {
+ level = options.hash.level;
+ } else if (options.data && options.data.level != null) {
+ level = options.data.level;
+ }
+ args[0] = level;
+
+ instance.log.apply(instance, args);
+ });
+ };
+
+ module.exports = exports['default'];
+
+/***/ },
+/* 12 */
+/***/ function(module, exports) {
+
+ 'use strict';
+
+ exports.__esModule = true;
+
+ exports['default'] = function (instance) {
+ instance.registerHelper('lookup', function (obj, field) {
+ return obj && obj[field];
+ });
+ };
+
+ module.exports = exports['default'];
+
+/***/ },
+/* 13 */
+/***/ function(module, exports, __webpack_require__) {
+
+ 'use strict';
+
+ exports.__esModule = true;
+
+ var _utils = __webpack_require__(4);
+
+ exports['default'] = function (instance) {
+ instance.registerHelper('with', function (context, options) {
+ if (_utils.isFunction(context)) {
+ context = context.call(this);
+ }
+
+ var fn = options.fn;
+
+ if (!_utils.isEmpty(context)) {
+ var data = options.data;
+ if (options.data && options.ids) {
+ data = _utils.createFrame(options.data);
+ data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);
+ }
+
+ return fn(context, {
+ data: data,
+ blockParams: _utils.blockParams([context], [data && data.contextPath])
+ });
+ } else {
+ return options.inverse(this);
+ }
+ });
+ };
+
+ module.exports = exports['default'];
+
+/***/ },
+/* 14 */
+/***/ function(module, exports, __webpack_require__) {
+
+ 'use strict';
+
+ var _interopRequireDefault = __webpack_require__(2)['default'];
+
+ exports.__esModule = true;
+ exports.registerDefaultDecorators = registerDefaultDecorators;
+
+ var _decoratorsInline = __webpack_require__(15);
+
+ var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);
+
+ function registerDefaultDecorators(instance) {
+ _decoratorsInline2['default'](instance);
+ }
+
+/***/ },
+/* 15 */
+/***/ function(module, exports, __webpack_require__) {
+
+ 'use strict';
+
+ exports.__esModule = true;
+
+ var _utils = __webpack_require__(4);
+
+ exports['default'] = function (instance) {
+ instance.registerDecorator('inline', function (fn, props, container, options) {
+ var ret = fn;
+ if (!props.partials) {
+ props.partials = {};
+ ret = function (context, options) {
+ // Create a new partials stack frame prior to exec.
+ var original = container.partials;
+ container.partials = _utils.extend({}, original, props.partials);
+ var ret = fn(context, options);
+ container.partials = original;
+ return ret;
+ };
+ }
+
+ props.partials[options.args[0]] = options.fn;
+
+ return ret;
+ });
+ };
+
+ module.exports = exports['default'];
+
+/***/ },
+/* 16 */
+/***/ function(module, exports, __webpack_require__) {
+
+ 'use strict';
+
+ exports.__esModule = true;
+
+ var _utils = __webpack_require__(4);
+
+ var logger = {
+ methodMap: ['debug', 'info', 'warn', 'error'],
+ level: 'info',
+
+ // Maps a given level value to the `methodMap` indexes above.
+ lookupLevel: function lookupLevel(level) {
+ if (typeof level === 'string') {
+ var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());
+ if (levelMap >= 0) {
+ level = levelMap;
+ } else {
+ level = parseInt(level, 10);
+ }
+ }
+
+ return level;
+ },
+
+ // Can be overridden in the host environment
+ log: function log(level) {
+ level = logger.lookupLevel(level);
+
+ if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {
+ var method = logger.methodMap[level];
+ if (!console[method]) {
+ // eslint-disable-line no-console
+ method = 'log';
+ }
+
+ for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ message[_key - 1] = arguments[_key];
+ }
+
+ console[method].apply(console, message); // eslint-disable-line no-console
+ }
+ }
+ };
+
+ exports['default'] = logger;
+ module.exports = exports['default'];
+
+/***/ },
+/* 17 */
+/***/ function(module, exports) {
+
+ // Build out our basic SafeString type
+ 'use strict';
+
+ exports.__esModule = true;
+ function SafeString(string) {
+ this.string = string;
+ }
+
+ SafeString.prototype.toString = SafeString.prototype.toHTML = function () {
+ return '' + this.string;
+ };
+
+ exports['default'] = SafeString;
+ module.exports = exports['default'];
+
+/***/ },
+/* 18 */
+/***/ function(module, exports, __webpack_require__) {
+
+ 'use strict';
+
+ var _interopRequireWildcard = __webpack_require__(1)['default'];
+
+ var _interopRequireDefault = __webpack_require__(2)['default'];
+
+ exports.__esModule = true;
+ exports.checkRevision = checkRevision;
+ exports.template = template;
+ exports.wrapProgram = wrapProgram;
+ exports.resolvePartial = resolvePartial;
+ exports.invokePartial = invokePartial;
+ exports.noop = noop;
+
+ var _utils = __webpack_require__(4);
+
+ var Utils = _interopRequireWildcard(_utils);
+
+ var _exception = __webpack_require__(5);
+
+ var _exception2 = _interopRequireDefault(_exception);
+
+ var _base = __webpack_require__(3);
+
+ function checkRevision(compilerInfo) {
+ var compilerRevision = compilerInfo && compilerInfo[0] || 1,
+ currentRevision = _base.COMPILER_REVISION;
+
+ if (compilerRevision !== currentRevision) {
+ if (compilerRevision < currentRevision) {
+ var runtimeVersions = _base.REVISION_CHANGES[currentRevision],
+ compilerVersions = _base.REVISION_CHANGES[compilerRevision];
+ throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');
+ } else {
+ // Use the embedded version info since the runtime doesn't know about this revision yet
+ throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');
+ }
+ }
+ }
+
+ function template(templateSpec, env) {
+ /* istanbul ignore next */
+ if (!env) {
+ throw new _exception2['default']('No environment passed to template');
+ }
+ if (!templateSpec || !templateSpec.main) {
+ throw new _exception2['default']('Unknown template object: ' + typeof templateSpec);
+ }
+
+ templateSpec.main.decorator = templateSpec.main_d;
+
+ // Note: Using env.VM references rather than local var references throughout this section to allow
+ // for external users to override these as psuedo-supported APIs.
+ env.VM.checkRevision(templateSpec.compiler);
+
+ function invokePartialWrapper(partial, context, options) {
+ if (options.hash) {
+ context = Utils.extend({}, context, options.hash);
+ if (options.ids) {
+ options.ids[0] = true;
+ }
+ }
+
+ partial = env.VM.resolvePartial.call(this, partial, context, options);
+ var result = env.VM.invokePartial.call(this, partial, context, options);
+
+ if (result == null && env.compile) {
+ options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);
+ result = options.partials[options.name](context, options);
+ }
+ if (result != null) {
+ if (options.indent) {
+ var lines = result.split('\n');
+ for (var i = 0, l = lines.length; i < l; i++) {
+ if (!lines[i] && i + 1 === l) {
+ break;
+ }
+
+ lines[i] = options.indent + lines[i];
+ }
+ result = lines.join('\n');
+ }
+ return result;
+ } else {
+ throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');
+ }
+ }
+
+ // Just add water
+ var container = {
+ strict: function strict(obj, name) {
+ if (!(name in obj)) {
+ throw new _exception2['default']('"' + name + '" not defined in ' + obj);
+ }
+ return obj[name];
+ },
+ lookup: function lookup(depths, name) {
+ var len = depths.length;
+ for (var i = 0; i < len; i++) {
+ if (depths[i] && depths[i][name] != null) {
+ return depths[i][name];
+ }
+ }
+ },
+ lambda: function lambda(current, context) {
+ return typeof current === 'function' ? current.call(context) : current;
+ },
+
+ escapeExpression: Utils.escapeExpression,
+ invokePartial: invokePartialWrapper,
+
+ fn: function fn(i) {
+ var ret = templateSpec[i];
+ ret.decorator = templateSpec[i + '_d'];
+ return ret;
+ },
+
+ programs: [],
+ program: function program(i, data, declaredBlockParams, blockParams, depths) {
+ var programWrapper = this.programs[i],
+ fn = this.fn(i);
+ if (data || depths || blockParams || declaredBlockParams) {
+ programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);
+ } else if (!programWrapper) {
+ programWrapper = this.programs[i] = wrapProgram(this, i, fn);
+ }
+ return programWrapper;
+ },
+
+ data: function data(value, depth) {
+ while (value && depth--) {
+ value = value._parent;
+ }
+ return value;
+ },
+ merge: function merge(param, common) {
+ var obj = param || common;
+
+ if (param && common && param !== common) {
+ obj = Utils.extend({}, common, param);
+ }
+
+ return obj;
+ },
+
+ noop: env.VM.noop,
+ compilerInfo: templateSpec.compiler
+ };
+
+ function ret(context) {
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
+
+ var data = options.data;
+
+ ret._setup(options);
+ if (!options.partial && templateSpec.useData) {
+ data = initData(context, data);
+ }
+ var depths = undefined,
+ blockParams = templateSpec.useBlockParams ? [] : undefined;
+ if (templateSpec.useDepths) {
+ if (options.depths) {
+ depths = context !== options.depths[0] ? [context].concat(options.depths) : options.depths;
+ } else {
+ depths = [context];
+ }
+ }
+
+ function main(context /*, options*/) {
+ return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);
+ }
+ main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);
+ return main(context, options);
+ }
+ ret.isTop = true;
+
+ ret._setup = function (options) {
+ if (!options.partial) {
+ container.helpers = container.merge(options.helpers, env.helpers);
+
+ if (templateSpec.usePartial) {
+ container.partials = container.merge(options.partials, env.partials);
+ }
+ if (templateSpec.usePartial || templateSpec.useDecorators) {
+ container.decorators = container.merge(options.decorators, env.decorators);
+ }
+ } else {
+ container.helpers = options.helpers;
+ container.partials = options.partials;
+ container.decorators = options.decorators;
+ }
+ };
+
+ ret._child = function (i, data, blockParams, depths) {
+ if (templateSpec.useBlockParams && !blockParams) {
+ throw new _exception2['default']('must pass block params');
+ }
+ if (templateSpec.useDepths && !depths) {
+ throw new _exception2['default']('must pass parent depths');
+ }
+
+ return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);
+ };
+ return ret;
+ }
+
+ function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {
+ function prog(context) {
+ var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
+
+ var currentDepths = depths;
+ if (depths && context !== depths[0]) {
+ currentDepths = [context].concat(depths);
+ }
+
+ return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);
+ }
+
+ prog = executeDecorators(fn, prog, container, depths, data, blockParams);
+
+ prog.program = i;
+ prog.depth = depths ? depths.length : 0;
+ prog.blockParams = declaredBlockParams || 0;
+ return prog;
+ }
+
+ function resolvePartial(partial, context, options) {
+ if (!partial) {
+ if (options.name === '@partial-block') {
+ partial = options.data['partial-block'];
+ } else {
+ partial = options.partials[options.name];
+ }
+ } else if (!partial.call && !options.name) {
+ // This is a dynamic partial that returned a string
+ options.name = partial;
+ partial = options.partials[partial];
+ }
+ return partial;
+ }
+
+ function invokePartial(partial, context, options) {
+ options.partial = true;
+ if (options.ids) {
+ options.data.contextPath = options.ids[0] || options.data.contextPath;
+ }
+
+ var partialBlock = undefined;
+ if (options.fn && options.fn !== noop) {
+ options.data = _base.createFrame(options.data);
+ partialBlock = options.data['partial-block'] = options.fn;
+
+ if (partialBlock.partials) {
+ options.partials = Utils.extend({}, options.partials, partialBlock.partials);
+ }
+ }
+
+ if (partial === undefined && partialBlock) {
+ partial = partialBlock;
+ }
+
+ if (partial === undefined) {
+ throw new _exception2['default']('The partial ' + options.name + ' could not be found');
+ } else if (partial instanceof Function) {
+ return partial(context, options);
+ }
+ }
+
+ function noop() {
+ return '';
+ }
+
+ function initData(context, data) {
+ if (!data || !('root' in data)) {
+ data = data ? _base.createFrame(data) : {};
+ data.root = context;
+ }
+ return data;
+ }
+
+ function executeDecorators(fn, prog, container, depths, data, blockParams) {
+ if (fn.decorator) {
+ var props = {};
+ prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);
+ Utils.extend(prog, props);
+ }
+ return prog;
+ }
+
+/***/ },
+/* 19 */
+/***/ function(module, exports) {
+
+ /* WEBPACK VAR INJECTION */(function(global) {/* global window */
+ 'use strict';
+
+ exports.__esModule = true;
+
+ exports['default'] = function (Handlebars) {
+ /* istanbul ignore next */
+ var root = typeof global !== 'undefined' ? global : window,
+ $Handlebars = root.Handlebars;
+ /* istanbul ignore next */
+ Handlebars.noConflict = function () {
+ if (root.Handlebars === Handlebars) {
+ root.Handlebars = $Handlebars;
+ }
+ return Handlebars;
+ };
+ };
+
+ module.exports = exports['default'];
+ /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
+
+/***/ }
+/******/ ])
+});
+;
diff --git a/client/js/libs/handlebars/colorClass.js b/client/js/libs/handlebars/colorClass.js
new file mode 100644
index 00000000..bd371910
--- /dev/null
+++ b/client/js/libs/handlebars/colorClass.js
@@ -0,0 +1,13 @@
+"use strict";
+
+Handlebars.registerHelper(
+ // Generates a string from "color-1" to "color-32" based on an input string
+ "colorClass", function(str) {
+ var hash = 0;
+ for (var i = 0; i < str.length; i++) {
+ hash += str.charCodeAt(i);
+ }
+
+ return "color-" + (1 + hash % 32);
+ }
+);
diff --git a/client/js/libs/handlebars/date.js b/client/js/libs/handlebars/date.js
new file mode 100644
index 00000000..751e713d
--- /dev/null
+++ b/client/js/libs/handlebars/date.js
@@ -0,0 +1,7 @@
+Handlebars.registerHelper(
+ "localeDate", function(date) {
+ date = new Date(date);
+
+ return date.toLocaleString();
+ }
+);
diff --git a/client/js/libs/handlebars/diff.js b/client/js/libs/handlebars/diff.js
new file mode 100644
index 00000000..21ee523c
--- /dev/null
+++ b/client/js/libs/handlebars/diff.js
@@ -0,0 +1,12 @@
+var diff;
+
+Handlebars.registerHelper(
+ "diff", function(a, opt) {
+ if (a !== diff) {
+ diff = a;
+ return opt.fn(this);
+ } else {
+ return opt.inverse(this);
+ }
+ }
+);
diff --git a/client/js/libs/handlebars/equal.js b/client/js/libs/handlebars/equal.js
new file mode 100644
index 00000000..15fdc033
--- /dev/null
+++ b/client/js/libs/handlebars/equal.js
@@ -0,0 +1,11 @@
+Handlebars.registerHelper(
+ "equal", function(a, b, opt) {
+ a = a.toString();
+ b = b.toString();
+ if (a === b) {
+ return opt.fn(this);
+ } else {
+ return opt.inverse(this);
+ }
+ }
+);
diff --git a/client/js/libs/handlebars/modes.js b/client/js/libs/handlebars/modes.js
new file mode 100644
index 00000000..f2907846
--- /dev/null
+++ b/client/js/libs/handlebars/modes.js
@@ -0,0 +1,14 @@
+Handlebars.registerHelper(
+ "modes", function(mode) {
+ var modes = {
+ "~": "owner",
+ "&": "admin",
+ "!": "admin",
+ "@": "op",
+ "%": "half-op",
+ "+": "voice",
+ "": "normal"
+ };
+ return modes[mode];
+ }
+);
diff --git a/client/js/libs/handlebars/parse.js b/client/js/libs/handlebars/parse.js
new file mode 100644
index 00000000..637fb0e7
--- /dev/null
+++ b/client/js/libs/handlebars/parse.js
@@ -0,0 +1,124 @@
+Handlebars.registerHelper(
+ "parse", function(text) {
+ text = Handlebars.Utils.escapeExpression(text);
+ text = colors(text);
+ text = channels(text);
+ text = uri(text);
+ return text;
+ }
+);
+
+function uri(text) {
+ return window.URI.withinString(text, function(url) {
+ if (url.indexOf("javascript:") === 0) {
+ return url;
+ }
+ var split = url.split("<");
+ url = "" + split[0] + " ";
+ if (split.length > 1) {
+ url += "<" + split.slice(1).join("<");
+ }
+ return url;
+ });
+}
+
+/**
+ * Channels names are strings of length up to fifty (50) characters.
+ * The only restriction on a channel name is that it SHALL NOT contain
+ * any spaces (' '), a control G (^G or ASCII 7), a comma (',').
+ * Channel prefix '&' is handled as '&' because this parser is executed
+ * after entities in the message have been escaped. This prevents a couple of bugs.
+ */
+function channels(text) {
+ return text.replace(
+ /(^|\s|\x07|,)((?:#|&)[^\x07\s\,]{1,49})/g,
+ '$1$2 '
+ );
+}
+
+/**
+ * MIRC compliant colour and style parser
+ * Unfortuanately this is a non trivial operation
+ * See this branch for source and tests
+ * https://github.com/megawac/irc-style-parser/tree/shout
+ */
+var styleCheck_Re = /[\x00-\x1F]/,
+ back_re = /^([0-9]{1,2})(,([0-9]{1,2}))?/,
+ colourKey = "\x03",
+ // breaks all open styles ^O (\x0F)
+ styleBreak = "\x0F";
+
+
+function styleTemplate(settings) {
+ return "" + settings.text + " ";
+}
+
+var styles = [
+ ["normal", "\x00", ""], ["underline", "\x1F"],
+ ["bold", "\x02"], ["italic", "\x1D"]
+].map(function(style) {
+ var escaped = encodeURI(style[1]).replace("%", "\\x");
+ return {
+ name: style[0],
+ style: style[2] ? style[2] : "irc-" + style[0],
+ key: style[1],
+ keyregex: new RegExp(escaped + "(.*?)(" + escaped + "|$)")
+ };
+});
+
+function colors(line) {
+ // http://www.mirc.com/colors.html
+ // http://www.aviran.org/stripremove-irc-client-control-characters/
+ // https://github.com/perl6/mu/blob/master/examples/rules/Grammar-IRC.pm
+ // regexs are cruel to parse this thing
+
+ // already done?
+ if (!styleCheck_Re.test(line)) {
+ return line;
+ }
+
+ // split up by the irc style break character ^O
+ if (line.indexOf(styleBreak) >= 0) {
+ return line.split(styleBreak).map(colors).join("");
+ }
+
+ var result = line;
+ var parseArr = result.split(colourKey);
+ var text, match, colour, background = "";
+ for (var i = 0; i < parseArr.length; i++) {
+ text = parseArr[i];
+ match = text.match(back_re);
+ if (!match) {
+ // ^C (no colour) ending. Escape current colour and carry on
+ background = "";
+ continue;
+ }
+ colour = "irc-fg" + +match[1];
+ // set the background colour
+ if (match[3]) {
+ background = " irc-bg" + +match[3];
+ }
+ // update the parsed text result
+ result = result.replace(colourKey + text, styleTemplate({
+ style: colour + background,
+ text: text.slice(match[0].length)
+ }));
+ }
+
+ // Matching styles (italics/bold/underline)
+ // if only colours were this easy...
+ styles.forEach(function(style) {
+ if (result.indexOf(style.key) < 0) {
+ return;
+ }
+
+ result = result.replace(style.keyregex, function(match, text) {
+ return styleTemplate({
+ "style": style.style,
+ "text": text
+ });
+ });
+ });
+
+ return result;
+}
diff --git a/client/js/libs/handlebars/roundBadgeNumber.js b/client/js/libs/handlebars/roundBadgeNumber.js
new file mode 100644
index 00000000..1a6ad031
--- /dev/null
+++ b/client/js/libs/handlebars/roundBadgeNumber.js
@@ -0,0 +1,9 @@
+Handlebars.registerHelper(
+ "roundBadgeNumber", function(count) {
+ if (count < 1000) {
+ return count;
+ }
+
+ return (count / 1000).toFixed(2).slice(0, -1) + "k";
+ }
+);
diff --git a/client/js/libs/handlebars/tojson.js b/client/js/libs/handlebars/tojson.js
new file mode 100644
index 00000000..7df32f77
--- /dev/null
+++ b/client/js/libs/handlebars/tojson.js
@@ -0,0 +1,7 @@
+"use strict";
+
+Handlebars.registerHelper(
+ "toJSON", function(context) {
+ return JSON.stringify(context);
+ }
+);
diff --git a/client/js/libs/handlebars/tz.js b/client/js/libs/handlebars/tz.js
new file mode 100644
index 00000000..e38fff94
--- /dev/null
+++ b/client/js/libs/handlebars/tz.js
@@ -0,0 +1,17 @@
+Handlebars.registerHelper(
+ "tz", function(time) {
+ time = new Date(time);
+ var h = time.getHours();
+ var m = time.getMinutes();
+
+ if (h < 10) {
+ h = "0" + h;
+ }
+
+ if (m < 10) {
+ m = "0" + m;
+ }
+
+ return h + ":" + m;
+ }
+);
diff --git a/client/js/libs/handlebars/users.js b/client/js/libs/handlebars/users.js
new file mode 100644
index 00000000..1aa6ac08
--- /dev/null
+++ b/client/js/libs/handlebars/users.js
@@ -0,0 +1,5 @@
+Handlebars.registerHelper(
+ "users", function(count) {
+ return count + " " + (count === 1 ? "user" : "users");
+ }
+);
diff --git a/client/js/libs/jquery.js b/client/js/libs/jquery.js
new file mode 100644
index 00000000..9f7b3d38
--- /dev/null
+++ b/client/js/libs/jquery.js
@@ -0,0 +1,9190 @@
+/*!
+ * jQuery JavaScript Library v2.1.1
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-05-01T17:11Z
+ */
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper window is present,
+ // execute the factory and get jQuery
+ // For environments that do not inherently posses a window with a document
+ // (such as Node.js), expose a jQuery-making factory as module.exports
+ // This accentuates the need for the creation of a real window
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//
+
+var arr = [];
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ version = "2.1.1",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.constructor &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+ // Support: Android < 4.0, iOS < 6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf("use strict") === 1 ) {
+ script = document.createElement("script");
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+ var length = obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v1.10.19
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-04-18
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + -(new Date()),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ strundefined = typeof undefined,
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf if we can't use a native one
+ indexOf = arr.indexOf || function( elem ) {
+ var i = 0,
+ len = this.length;
+ for ( ; i < len; i++ ) {
+ if ( this[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + characterEncoding + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( documentIsHTML && !seed ) {
+
+ // Shortcuts
+ if ( (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document (jQuery #6963)
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType === 9 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== strundefined && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare,
+ doc = node ? node.ownerDocument || node : preferredDoc,
+ parent = doc.defaultView;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+
+ // Support tests
+ documentIsHTML = !isXML( doc );
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent !== parent.top ) {
+ // IE11 does not have attachEvent, so all must suffer
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", function() {
+ setDocument();
+ }, false );
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", function() {
+ setDocument();
+ });
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Check if getElementsByClassName can be trusted
+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
+ div.innerHTML = "
";
+
+ // Support: Safari<4
+ // Catch class over-caching
+ div.firstChild.className = "i";
+ // Support: Opera<10
+ // Catch gEBCN failure to find non-leading classes
+ return div.getElementsByClassName("i").length === 2;
+ });
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== strundefined ) {
+ return context.getElementsByTagName( tag );
+ }
+ } :
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ div.innerHTML = " ";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowclip^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf.call( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (oldCache = outerCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ outerCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf.call( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is no seed and only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = " ";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = " ";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ });
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ });
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
+ });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
+};
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], false) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], true) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof rootjQuery.ready !== "undefined" ?
+ rootjQuery.ready( selector ) :
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ // methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.extend({
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+ }
+});
+
+jQuery.fn.extend({
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter(function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.unique(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+function sibling( cur, dir ) {
+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.unique( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ firingLength = 0;
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( list && ( !fired || stack ) ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // if we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend({
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+});
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[0], key ) : emptyGet;
+};
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( owner ) {
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+function Data() {
+ // Support: Android < 4,
+ // Old WebKit does not have Object.preventExtensions/freeze method,
+ // return new empty object instead with no [[set]] accessor
+ Object.defineProperty( this.cache = {}, 0, {
+ get: function() {
+ return {};
+ }
+ });
+
+ this.expando = jQuery.expando + Math.random();
+}
+
+Data.uid = 1;
+Data.accepts = jQuery.acceptData;
+
+Data.prototype = {
+ key: function( owner ) {
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return the key for a frozen object.
+ if ( !Data.accepts( owner ) ) {
+ return 0;
+ }
+
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[ this.expando ];
+
+ // If not, create one
+ if ( !unlock ) {
+ unlock = Data.uid++;
+
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ descriptor[ this.expando ] = { value: unlock };
+ Object.defineProperties( owner, descriptor );
+
+ // Support: Android < 4
+ // Fallback to a less secure definition
+ } catch ( e ) {
+ descriptor[ this.expando ] = unlock;
+ jQuery.extend( owner, descriptor );
+ }
+ }
+
+ // Ensure the cache object
+ if ( !this.cache[ unlock ] ) {
+ this.cache[ unlock ] = {};
+ }
+
+ return unlock;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+ // Fresh assignments by object are shallow copied
+ if ( jQuery.isEmptyObject( cache ) ) {
+ jQuery.extend( this.cache[ unlock ], data );
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object. A valid owner object must be provided.
+ var cache = this.cache[ this.key( owner ) ];
+
+ return key === undefined ?
+ cache : cache[ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ((key && typeof key === "string") && value === undefined) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase(key) );
+ }
+
+ // [*]When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ if ( key === undefined ) {
+ this.cache[ unlock ] = {};
+
+ } else {
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ return !jQuery.isEmptyObject(
+ this.cache[ owner[ this.expando ] ] || {}
+ );
+ },
+ discard: function( owner ) {
+ if ( owner[ this.expando ] ) {
+ delete this.cache[ owner[ this.expando ] ];
+ }
+ }
+};
+var data_priv = new Data();
+
+var data_user = new Data();
+
+
+
+/*
+ Implementation Summary
+
+ 1. Enforce API surface and semantic compatibility with 1.9.x branch
+ 2. Improve the module's maintainability by reducing the storage
+ paths to a single mechanism.
+ 3. Use the same single mechanism to support "private" and "user" data.
+ 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+ 5. Avoid exposing implementation details on user objects (eg. expando properties)
+ 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+*/
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ data_user.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend({
+ hasData: function( elem ) {
+ return data_user.hasData( elem ) || data_priv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return data_user.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ data_user.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to data_priv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return data_priv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ data_priv.remove( elem, name );
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = data_user.get( elem );
+
+ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ data_priv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ data_user.set( this, key );
+ });
+ }
+
+ return access( this, function( value ) {
+ var data,
+ camelKey = jQuery.camelCase( key );
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = data_user.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = data_user.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each(function() {
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = data_user.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf("-") !== -1 && data !== undefined ) {
+ data_user.set( this, key, value );
+ }
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ data_user.remove( this, key );
+ });
+ }
+});
+
+
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = data_priv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // not intended for public consumption - generates a queueHooks object, or returns the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ data_priv.remove( elem, [ type + "queue", key ] );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+var rcheckableType = (/^(?:checkbox|radio)$/i);
+
+
+
+(function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` need .setAttribute for WWA
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+ // old WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ // Support: IE9-IE11+
+ div.innerHTML = "x ";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+})();
+var strundefined = typeof undefined;
+
+
+
+support.focusinBubbles = "onfocusin" in window;
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+ data_priv.remove( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+ jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.disabled !== true || event.type !== "click" ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome < 28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+ // Support: Android < 4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && e.preventDefault ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && e.stopImmediatePropagation ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+});
+
+// Create "bubbling" focus and blur events
+// Support: Firefox, Chrome, Safari
+if ( !support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ data_priv.remove( doc, fix );
+
+ } else {
+ data_priv.access( doc, fix, attaches );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on( types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+});
+
+
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rhtml = /<|?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+
+ // Support: IE 9
+ option: [ 1, "", " " ],
+
+ thead: [ 1, "" ],
+ col: [ 2, "" ],
+ tr: [ 2, "" ],
+ td: [ 3, "" ],
+
+ _default: [ 0, "", "" ]
+ };
+
+// Support: IE 9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
+
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+
+ if ( match ) {
+ elem.type = match[ 1 ];
+ } else {
+ elem.removeAttribute("type");
+ }
+
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ data_priv.set(
+ elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( data_priv.hasData( src ) ) {
+ pdataOld = data_priv.access( src );
+ pdataCur = data_priv.set( dest, pdataOld );
+ events = pdataOld.events;
+
+ if ( events ) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( data_user.hasData( src ) ) {
+ udataOld = data_user.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ data_user.set( dest, udataCur );
+ }
+}
+
+function getAll( context, tag ) {
+ var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+ context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+// Support: IE >= 9
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ // Support: IE >= 9
+ // Fix Cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function( elems, context, scripts, selection ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement("div") );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>$2>" ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Fixes #12346
+ // Support: Webkit, IE
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type, key,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+ if ( jQuery.acceptData( elem ) ) {
+ key = elem[ data_priv.expando ];
+
+ if ( key && (data = data_priv.cache[ key ]) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+ if ( data_priv.cache[ key ] ) {
+ // Discard any remaining `private` data
+ delete data_priv.cache[ key ];
+ }
+ }
+ }
+ // Discard any remaining `user` data
+ delete data_user.cache[ elem[ data_user.expando ] ];
+ }
+ }
+});
+
+jQuery.fn.extend({
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each(function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ });
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ });
+ },
+
+ remove: function( selector, keepData /* Internal Use Only */ ) {
+ var elem,
+ elems = selector ? jQuery.filter( selector, this ) : this,
+ i = 0;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
+
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
+ }
+ elem.parentNode.removeChild( elem );
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map(function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+ value = value.replace( rxhtmlTag, "<$1>$2>" );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var arg = arguments[ 0 ];
+
+ // Make the changes, replacing each context element with the new content
+ this.domManip( arguments, function( elem ) {
+ arg = this.parentNode;
+
+ jQuery.cleanData( getAll( this ) );
+
+ if ( arg ) {
+ arg.replaceChild( elem, this );
+ }
+ });
+
+ // Force removal if there was no new content (e.g., from empty arguments)
+ return arg && (arg.length || arg.nodeType) ? this : this.remove();
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, callback ) {
+
+ // Flatten any nested arrays
+ args = concat.apply( [], args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ isFunction = jQuery.isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( isFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ self.domManip( args, callback );
+ });
+ }
+
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ if ( first ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( this[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+ if ( node.src ) {
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl ) {
+ jQuery._evalUrl( node.src );
+ }
+ } else {
+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return this;
+ }
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: QtWebKit
+ // .get() because push.apply(_, arraylike) throws
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+
+var iframe,
+ elemdisplay = {};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+ var style,
+ elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+ // getDefaultComputedStyle might be reliably used only on attached element
+ display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
+
+ // Use of this method is a temporary fix (more like optmization) until something better comes along,
+ // since it was removed from specification and supported only in FF
+ style.display : jQuery.css( elem[ 0 ], "display" );
+
+ // We don't have any data stored on the element,
+ // so use "detach" method as fast way to get rid of the element
+ elem.detach();
+
+ return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
+
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
+
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+
+ // Use the already-created iframe if possible
+ iframe = (iframe || jQuery( "" )).appendTo( doc.documentElement );
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = iframe[ 0 ].contentDocument;
+
+ // Support: IE
+ doc.write();
+ doc.close();
+
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return display;
+}
+var rmargin = (/^margin/);
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+ return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+ };
+
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // Support: IE9
+ // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+ }
+
+ if ( computed ) {
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // Support: iOS < 6
+ // A tribute to the "awesome hack by Dean Edwards"
+ // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+ // Support: IE
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+ // Hook not needed (or it's not possible to use it due to missing dependency),
+ // remove it.
+ // Since there are no other hooks for marginRight, remove the whole object.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+
+ return (this.get = hookFn).apply( this, arguments );
+ }
+ };
+}
+
+
+(function() {
+ var pixelPositionVal, boxSizingReliableVal,
+ docElem = document.documentElement,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ if ( !div.style ) {
+ return;
+ }
+
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
+ "position:absolute";
+ container.appendChild( div );
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computePixelPositionAndBoxSizingReliable() {
+ div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+ "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+ "border:1px;padding:1px;width:4px;position:absolute";
+ div.innerHTML = "";
+ docElem.appendChild( container );
+
+ var divStyle = window.getComputedStyle( div, null );
+ pixelPositionVal = divStyle.top !== "1%";
+ boxSizingReliableVal = divStyle.width === "4px";
+
+ docElem.removeChild( container );
+ }
+
+ // Support: node.js jsdom
+ // Don't assume that getComputedStyle is a property of the global object
+ if ( window.getComputedStyle ) {
+ jQuery.extend( support, {
+ pixelPosition: function() {
+ // This test is executed only once but we still do memoizing
+ // since we can use the boxSizingReliable pre-computing.
+ // No need to check if the test was already performed, though.
+ computePixelPositionAndBoxSizingReliable();
+ return pixelPositionVal;
+ },
+ boxSizingReliable: function() {
+ if ( boxSizingReliableVal == null ) {
+ computePixelPositionAndBoxSizingReliable();
+ }
+ return boxSizingReliableVal;
+ },
+ reliableMarginRight: function() {
+ // Support: Android 2.3
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // This support function is only executed once so no memoizing is needed.
+ var ret,
+ marginDiv = div.appendChild( document.createElement( "div" ) );
+
+ // Reset CSS: box-sizing; display; margin; border; padding
+ marginDiv.style.cssText = div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+ "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+ docElem.appendChild( container );
+
+ ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
+
+ docElem.removeChild( container );
+
+ return ret;
+ }
+ });
+ }
+})();
+
+
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+var
+ // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ },
+
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+ // shortcut for names that are not vendor prefixed
+ if ( name in style ) {
+ return name;
+ }
+
+ // check for vendor prefixed names
+ var capName = name[0].toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in style ) {
+ return name;
+ }
+ }
+
+ return origName;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // at this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ } else {
+ // at this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // at this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // we need the check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
+}
+
+function showHide( elements, show ) {
+ var display, elem, hidden,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ values[ index ] = data_priv.get( elem, "olddisplay" );
+ display = elem.style.display;
+ if ( show ) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !values[ index ] && display === "none" ) {
+ elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( elem.style.display === "" && isHidden( elem ) ) {
+ values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+ }
+ } else {
+ hidden = isHidden( elem );
+
+ if ( display !== "none" || !hidden ) {
+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( index = 0; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+ elem.style.display = show ? values[ index ] || "" : "none";
+ }
+ }
+
+ return elements;
+}
+
+jQuery.extend({
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ // normalize float css property
+ "float": "cssFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = jQuery.camelCase( name ),
+ style = elem.style;
+
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // convert relative number strings (+= or -=) to relative numbers. #7345
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set. See: #7116
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number was passed in, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
+ // but it would mean to define eight (for every problematic property) identical functions
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+ style[ name ] = value;
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = jQuery.camelCase( name );
+
+ // Make sure that we're working with the right name
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ //convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Return, converting to number if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
+ }
+});
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+ // certain elements can have dimension info if we invisibly show them
+ // however, it must have a current display style that would benefit from this
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+
+// Support: Android 2.3
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+ function( elem, computed ) {
+ if ( computed ) {
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // Work around by temporarily setting element display to inline-block
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each(function() {
+ if ( isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
+
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails
+ // so, simple values such as "10px" are parsed to Float.
+ // complex values such as "rotate(1rad)" are returned as is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // use step hook for back compat - use cssHook if its there - use .style if its
+ // available and use plain properties where available
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ }
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value ),
+ target = tween.cur(),
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+ scale = 1,
+ maxIterations = 20;
+
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
+
+ // Make sure we update the tween properties later on
+ parts = parts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*
+ // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
+ tween.unit = unit;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
+ }
+
+ return tween;
+ } ]
+ };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // if we include width, step value is 1 to do all cssExpand values,
+ // if we don't include width, step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+ // we're done with this property
+ return tween;
+ }
+ }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = data_priv.get( elem, "fxshow" );
+
+ // handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function() {
+ // doing this makes sure that the complete handler will be called
+ // before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE9-10 do not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ display = jQuery.css( elem, "display" );
+
+ // Test default display if display is currently "none"
+ checkDisplay = display === "none" ?
+ data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+ if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+ style.display = "inline-block";
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+
+ // show/hide pass
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+ hidden = true;
+ } else {
+ continue;
+ }
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+ // Any non-fx value stops us from restoring the original display value
+ } else {
+ display = undefined;
+ }
+ }
+
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = data_priv.access( elem, "fxshow", {} );
+ }
+
+ // store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+
+ data_priv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
+ }
+ }
+
+ // If this is a noop like .hide().hide(), restore an overwritten display value
+ } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+ style.display = display;
+ }
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // not quite $.extend, this wont overwrite keys already present.
+ // also - reusing 'index' from above because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // if we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // resolve when we played the last frame
+ // otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+ // animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || data_priv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = data_priv.get( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // start the next in the queue if the last step wasn't forced
+ // timers currently will call their complete callbacks, which will dequeue
+ // but only if they were gotoEnd
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = data_priv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // enable finishing flag on private data
+ data.finish = true;
+
+ // empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // turn off finishing flag
+ delete data.finish;
+ });
+ }
+});
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = jQuery.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ if ( timer() ) {
+ jQuery.fx.start();
+ } else {
+ jQuery.timers.pop();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+};
+
+
+(function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: iOS 5.1, Android 4.x, Android 2.3
+ // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
+ support.checkOn = input.value !== "";
+
+ // Must access the parent to make an option select properly
+ // Support: IE9, IE10
+ support.optSelected = opt.selected;
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as disabled)
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Check if an input maintains its value after becoming a radio
+ // Support: IE9, IE10
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+})();
+
+
+var nodeHook, boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ }
+});
+
+jQuery.extend({
+ attr: function( elem, name, value ) {
+ var hooks, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ elem[ propName ] = false;
+ }
+
+ elem.removeAttribute( name );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ jQuery.nodeName( elem, "input" ) ) {
+ // Setting the type on a radio button after the value resets the value in IE6-9
+ // Reset value to default in case type is set after value during creation
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle;
+ if ( !isXML ) {
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ name ];
+ attrHandle[ name ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ name.toLowerCase() :
+ null;
+ attrHandle[ name ] = handle;
+ }
+ return ret;
+ };
+});
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i;
+
+jQuery.fn.extend({
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each(function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ });
+ }
+});
+
+jQuery.extend({
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
+
+ } else {
+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+ ret :
+ elem[ name ];
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+ elem.tabIndex :
+ -1;
+ }
+ }
+ }
+});
+
+// Support: IE9+
+// Selectedness for an option in an optgroup can be inaccurate
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ }
+ };
+}
+
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+jQuery.fn.extend({
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = jQuery.trim( cur );
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = arguments.length === 0 || typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = value ? jQuery.trim( cur ) : "";
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ classNames = value.match( rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( type === strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ data_priv.set( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed "false",
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+});
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // handle most common string cases
+ ret.replace(rreturn, "") :
+ // handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ // Support: IE10-11+
+ // option.text throws exceptions (#14686, #14858)
+ jQuery.trim( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // IE6-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
+
+ // force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ // Support: Webkit
+ // "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
+});
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+});
+
+jQuery.fn.extend({
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+ }
+});
+
+
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+// Support: Android 2.3
+// Workaround failure to string-cast null input
+jQuery.parseJSON = function( data ) {
+ return JSON.parse( data + "" );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE9
+ try {
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data, "text/xml" );
+ } catch ( e ) {
+ xml = undefined;
+ }
+
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+};
+
+
+var
+ // Document location
+ ajaxLocParts,
+ ajaxLocation,
+
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+ ajaxLocation = location.href;
+} catch( e ) {
+ // Use the href attribute of an A element
+ // since IE will modify it given document.location
+ ajaxLocation = document.createElement( "a" );
+ ajaxLocation.href = "";
+ ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+ if ( jQuery.isFunction( func ) ) {
+ // For each dataType in the dataTypeExpression
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ });
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s[ "throws" ] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ type: "GET",
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // The jqXHR state
+ state = 0,
+ // Default abort message
+ strAbort = "canceled",
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( state === 2 ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ fireGlobals = s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
+
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+ // Otherwise add one to the end
+ cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
+ }
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+ // We extract error from statusText
+ // then normalize statusText and status for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
+ };
+});
+
+
+jQuery._evalUrl = function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+};
+
+
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[ 0 ] ) {
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ }
+});
+
+
+jQuery.expr.filters.hidden = function( elem ) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+};
+jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ) {
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new XMLHttpRequest();
+ } catch( e ) {}
+};
+
+var xhrId = 0,
+ xhrCallbacks = {},
+ xhrSuccessStatus = {
+ // file protocol always yields status code 0, assume 200
+ 0: 200,
+ // Support: IE9
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE9
+// Open requests must be manually aborted on unload (#5280)
+if ( window.ActiveXObject ) {
+ jQuery( window ).on( "unload", function() {
+ for ( var key in xhrCallbacks ) {
+ xhrCallbacks[ key ]();
+ }
+ });
+}
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport(function( options ) {
+ var callback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr(),
+ id = ++xhrId;
+
+ xhr.open( options.type, options.url, options.async, options.username, options.password );
+
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ delete xhrCallbacks[ id ];
+ callback = xhr.onload = xhr.onerror = null;
+
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+ complete(
+ // file: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+ // Support: IE9
+ // Accessing binary-data responseText throws an exception
+ // (#11426)
+ typeof xhr.responseText === "string" ? {
+ text: xhr.responseText
+ } : undefined,
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ xhr.onerror = callback("error");
+
+ // Create the abort callback
+ callback = xhrCallbacks[ id ] = callback("abort");
+
+ try {
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /(?:java|ecma)script/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+ var script, callback;
+ return {
+ send: function( _, complete ) {
+ script = jQuery("
diff --git a/test/client/index.html b/test/client/index.html
deleted file mode 100644
index dc6f424b..00000000
--- a/test/client/index.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
- Tests
-
-
-
-
-
-
diff --git a/test/client/index.ts b/test/client/index.ts
deleted file mode 100644
index 7ea13839..00000000
--- a/test/client/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-// Recursively load all JS files (test files) in the `js` folder
-// @ts-expect-error ts-migrate(2339) FIXME: Property 'context' does not exist on type 'NodeReq... Remove this comment to see the full error message
-const context = require.context("./js", true, /.+\.js$/);
-context.keys().forEach(context);
-
-module.exports = context;
diff --git a/test/client/js/authTest.ts b/test/client/js/authTest.ts
deleted file mode 100644
index eacb53b6..00000000
--- a/test/client/js/authTest.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import {expect} from "chai";
-import sinon from "ts-sinon";
-import Auth from "../../../client/js/auth";
-import localStorage from "../../../client/js/localStorage";
-import location from "../../../client/js/location";
-
-describe("Auth", function () {
- describe(".signout", function () {
- let localStorageClearStub: sinon.SinonStub<[], void>;
- let locationReloadStub: sinon.SinonStub<[], void>;
-
- beforeEach(function () {
- localStorageClearStub = sinon.stub(localStorage, "clear");
- locationReloadStub = sinon.stub(location, "reload");
- });
-
- afterEach(function () {
- localStorageClearStub.restore();
- locationReloadStub.restore();
- });
-
- it("should empty the local storage", function () {
- Auth.signout();
- // @ts-expect-error ts-migrate(2339) FIXME: Property 'calledOnce' does not exist on type '() =... Remove this comment to see the full error message
- expect(localStorage.clear.calledOnce).to.be.true;
- });
-
- it("should reload the page", function () {
- Auth.signout();
- // @ts-expect-error ts-migrate(2339) FIXME: Property 'calledOnce' does not exist on type '{ ()... Remove this comment to see the full error message
- expect(location.reload.calledOnce).to.be.true;
- });
- });
-});
diff --git a/test/client/js/constantsTest.ts b/test/client/js/constantsTest.ts
deleted file mode 100644
index 26ae668b..00000000
--- a/test/client/js/constantsTest.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import {expect} from "chai";
-import constants from "../../../client/js/constants";
-import {describe} from "mocha";
-
-describe("client-side constants", function () {
- describe(".colorCodeMap", function () {
- it("should be a non-empty array", function () {
- expect(constants.colorCodeMap).to.be.an("array").of.length(16);
- });
-
- it("should be made of pairs of strings", function () {
- constants.colorCodeMap.forEach(([code, name]) => {
- expect(code)
- .to.be.a("string")
- .that.match(/[0-9]{2}/);
- expect(name).to.be.a("string");
- });
- });
- });
-
- describe(".timeFormats", function () {
- it("should be objects of strings", function () {
- expect(constants.timeFormats.msgDefault).to.be.an("string").that.is.not.empty;
- expect(constants.timeFormats.msgWithSeconds).to.be.an("string").that.is.not.empty;
- });
- });
-});
diff --git a/test/client/js/helpers/friendlysizeTest.ts b/test/client/js/helpers/friendlysizeTest.ts
deleted file mode 100644
index 52d43e88..00000000
--- a/test/client/js/helpers/friendlysizeTest.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import {expect} from "chai";
-import friendlysize from "../../../../client/js/helpers/friendlysize";
-
-describe("friendlysize helper", function () {
- it("should render human-readable version", function () {
- expect(friendlysize(51200)).to.equal("50 KiB");
- expect(friendlysize(2)).to.equal("2 Bytes");
- expect(friendlysize(1023)).to.equal("1023 Bytes");
- expect(friendlysize(1024)).to.equal("1 KiB");
- expect(friendlysize(Math.pow(1024, 2))).to.equal("1 MiB");
- expect(friendlysize(Math.pow(1024, 3))).to.equal("1 GiB");
- expect(friendlysize(Math.pow(1024, 4))).to.equal("1 TiB");
- expect(friendlysize(Math.pow(1024, 5))).to.equal("1 PiB");
- });
-
- it("should round with 1 digit", function () {
- expect(friendlysize(1234567)).to.equal("1.2 MiB");
- });
-
- it("should render special case 0 as 0 Bytes", function () {
- expect(friendlysize(0)).to.equal("0 Bytes");
- });
-
- it("should render max safe integer as petabytes", function () {
- expect(friendlysize(Number.MAX_SAFE_INTEGER)).to.equal("8 PiB");
- });
-});
diff --git a/test/client/js/helpers/ircmessageparser/anyIntersection.ts b/test/client/js/helpers/ircmessageparser/anyIntersection.ts
deleted file mode 100644
index 15cb054f..00000000
--- a/test/client/js/helpers/ircmessageparser/anyIntersection.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import {expect} from "chai";
-import anyIntersection from "../../../../../client/js/helpers/ircmessageparser/anyIntersection";
-
-describe("anyIntersection", () => {
- it("should not intersect on edges", () => {
- const a = {start: 1, end: 2};
- const b = {start: 2, end: 3};
-
- expect(anyIntersection(a, b)).to.equal(false);
- expect(anyIntersection(b, a)).to.equal(false);
- });
-
- it("should intersect on overlapping", () => {
- const a = {start: 0, end: 3};
- const b = {start: 1, end: 2};
-
- expect(anyIntersection(a, b)).to.equal(true);
- expect(anyIntersection(b, a)).to.equal(true);
- });
-
- it("should not intersect", () => {
- const a = {start: 0, end: 1};
- const b = {start: 2, end: 3};
-
- expect(anyIntersection(a, b)).to.equal(false);
- expect(anyIntersection(b, a)).to.equal(false);
- });
-});
diff --git a/test/client/js/helpers/ircmessageparser/fill.ts b/test/client/js/helpers/ircmessageparser/fill.ts
deleted file mode 100644
index 57c90b53..00000000
--- a/test/client/js/helpers/ircmessageparser/fill.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import {expect} from "chai";
-import fill from "../../../../../client/js/helpers/ircmessageparser/fill";
-
-describe("fill", () => {
- const text = "01234567890123456789";
-
- it("should return an entry for the unmatched end of string", () => {
- const existingEntries = [
- {start: 0, end: 10},
- {start: 5, end: 15},
- ];
-
- const expected = [{start: 15, end: 20}];
-
- const actual = fill(existingEntries, text);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should return an entry per unmatched areas of the text", () => {
- const existingEntries = [
- {start: 0, end: 5},
- {start: 10, end: 15},
- ];
-
- const expected = [
- {start: 5, end: 10},
- {start: 15, end: 20},
- ];
-
- const actual = fill(existingEntries, text);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not return anything when entries match all text", () => {
- const existingEntries = [
- {start: 0, end: 10},
- {start: 10, end: 20},
- ];
-
- const actual = fill(existingEntries, text);
-
- expect(actual).to.be.empty;
- });
-});
diff --git a/test/client/js/helpers/ircmessageparser/findChannels.ts b/test/client/js/helpers/ircmessageparser/findChannels.ts
deleted file mode 100644
index bb45d828..00000000
--- a/test/client/js/helpers/ircmessageparser/findChannels.ts
+++ /dev/null
@@ -1,154 +0,0 @@
-import {expect} from "chai";
-import findChannels from "../../../../../client/js/helpers/ircmessageparser/findChannels";
-
-describe("findChannels", () => {
- it("should find single letter channel", () => {
- const input = "#a";
- const expected = [
- {
- channel: "#a",
- start: 0,
- end: 2,
- },
- ];
-
- const actual = findChannels(input, ["#"], ["@", "+"]);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find utf8 channels", () => {
- const input = "#äöü";
- const expected = [
- {
- channel: "#äöü",
- start: 0,
- end: 4,
- },
- ];
-
- const actual = findChannels(input, ["#"], ["@", "+"]);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find inline channel", () => {
- const input = "inline #channel text";
- const expected = [
- {
- channel: "#channel",
- start: 7,
- end: 15,
- },
- ];
-
- const actual = findChannels(input, ["#"], ["@", "+"]);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should stop at \\0x07", () => {
- const input = "#chan\x07nel";
- const expected = [
- {
- channel: "#chan",
- start: 0,
- end: 5,
- },
- ];
-
- const actual = findChannels(input, ["#"], ["@", "+"]);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should allow classics pranks", () => {
- const input = "#1,000";
- const expected = [
- {
- channel: "#1,000",
- start: 0,
- end: 6,
- },
- ];
-
- const actual = findChannels(input, ["#"], ["@", "+"]);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should work with whois responses", () => {
- const input = "@#a";
- const expected = [
- {
- channel: "#a",
- start: 1,
- end: 3,
- },
- ];
-
- const actual = findChannels(input, ["#"], ["@", "+"]);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should work with IRCv3.1 multi-prefix", () => {
- const input = "!@%+#a";
- const expected = [
- {
- channel: "#a",
- start: 4,
- end: 6,
- },
- ];
-
- const actual = findChannels(input, ["#"], ["!", "@", "%", "+"]);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should work with custom channelPrefixes", () => {
- const input = "@a";
- const expected = [
- {
- channel: "@a",
- start: 0,
- end: 2,
- },
- ];
-
- const actual = findChannels(input, ["@"], ["#", "+"]);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should work with - in usermodes", () => {
- const input = "-#a some -text";
- const expected = [
- {
- channel: "#a",
- start: 1,
- end: 3,
- },
- ];
-
- const actual = findChannels(input, ["#"], ["#", "+", "-"]);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should handle multiple channelPrefix correctly", () => {
- const input = "##test";
- const expected = [
- {
- channel: "##test",
- start: 0,
- end: 6,
- },
- ];
-
- const actual = findChannels(input, ["#"], ["@", "+"]);
-
- expect(actual).to.deep.equal(expected);
- });
-});
diff --git a/test/client/js/helpers/ircmessageparser/findEmoji.ts b/test/client/js/helpers/ircmessageparser/findEmoji.ts
deleted file mode 100644
index f37f9519..00000000
--- a/test/client/js/helpers/ircmessageparser/findEmoji.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import {expect} from "chai";
-import findEmoji from "../../../../../client/js/helpers/ircmessageparser/findEmoji";
-
-describe("findEmoji", () => {
- it("should find default emoji presentation character", () => {
- const input = "test \u{231A} test";
- const expected = [
- {
- start: 5,
- end: 6,
- emoji: "\u{231A}",
- },
- ];
-
- const actual = findEmoji(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find default text presentation character rendered as emoji", () => {
- const input = "test \u{2194}\u{FE0F} test";
- const expected = [
- {
- start: 5,
- end: 7,
- emoji: "\u{2194}\u{FE0F}",
- },
- ];
-
- const actual = findEmoji(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find emoji modifier base", () => {
- const input = "test\u{1F469}test";
- const expected = [
- {
- start: 4,
- end: 6,
- emoji: "\u{1F469}",
- },
- ];
-
- const actual = findEmoji(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find emoji modifier base followed by a modifier", () => {
- const input = "test\u{1F469}\u{1F3FF}test";
- const expected = [
- {
- start: 4,
- end: 8,
- emoji: "\u{1F469}\u{1F3FF}",
- },
- ];
-
- const actual = findEmoji(input);
-
- expect(actual).to.deep.equal(expected);
- });
-});
diff --git a/test/client/js/helpers/ircmessageparser/findNames.ts b/test/client/js/helpers/ircmessageparser/findNames.ts
deleted file mode 100644
index d000407c..00000000
--- a/test/client/js/helpers/ircmessageparser/findNames.ts
+++ /dev/null
@@ -1,79 +0,0 @@
-import {expect} from "chai";
-import findNames from "../../../../../client/js/helpers/ircmessageparser/findNames";
-
-describe("findNames", () => {
- it("should find nicks in text", () => {
- const input = ": Hello, xPaw, how's it going?";
- const expected = [
- {
- start: 1,
- end: 10,
- nick: "MaxLeiter",
- },
- {
- start: 20,
- end: 24,
- nick: "xPaw",
- },
- ];
- const nicks = ["MaxLeiter", "xPaw"];
- const actual = findNames(input, nicks);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not find nicks as part of a bigger string (issue #1776)", () => {
- const input = "you're very unlucky, luck";
- const expected = [
- {
- start: 21,
- end: 25,
- nick: "luck",
- },
- ];
- const nicks = ["luck"];
- const actual = findNames(input, nicks);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find nicks as short as one character (issue #1885)", () => {
- const input = "aaa aa abc a";
- const expected = [
- {
- start: 11,
- end: 12,
- nick: "a",
- },
- ];
- const nicks = ["a"];
- const actual = findNames(input, nicks);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find same nick multiple times", () => {
- const input = "xPaw xPaw xPaw";
- const expected = [
- {
- start: 0,
- end: 4,
- nick: "xPaw",
- },
- {
- start: 5,
- end: 9,
- nick: "xPaw",
- },
- {
- start: 10,
- end: 14,
- nick: "xPaw",
- },
- ];
- const nicks = ["xPaw", "xPaw", "xPaw"];
- const actual = findNames(input, nicks);
-
- expect(actual).to.deep.equal(expected);
- });
-});
diff --git a/test/client/js/helpers/ircmessageparser/merge.ts b/test/client/js/helpers/ircmessageparser/merge.ts
deleted file mode 100644
index 58191832..00000000
--- a/test/client/js/helpers/ircmessageparser/merge.ts
+++ /dev/null
@@ -1,159 +0,0 @@
-import {expect} from "chai";
-import merge from "../../../../../client/js/helpers/ircmessageparser/merge";
-
-describe("merge", () => {
- it("should split style information", () => {
- const textParts = [
- {
- start: 0,
- end: 10,
- flag1: true,
- },
- {
- start: 10,
- end: 20,
- flag2: true,
- },
- ];
- const styleFragments = [
- {
- start: 0,
- end: 5,
- text: "01234",
- },
- {
- start: 5,
- end: 15,
- text: "5678901234",
- },
- {
- start: 15,
- end: 20,
- text: "56789",
- },
- ];
-
- const expected = [
- {
- start: 0,
- end: 10,
- flag1: true,
- fragments: [
- {
- start: 0,
- end: 5,
- text: "01234",
- },
- {
- start: 5,
- end: 10,
- text: "56789",
- },
- ],
- },
- {
- start: 10,
- end: 20,
- flag2: true,
- fragments: [
- {
- start: 10,
- end: 15,
- text: "01234",
- },
- {
- start: 15,
- end: 20,
- text: "56789",
- },
- ],
- },
- ];
-
- const actual = merge(
- textParts as any,
- styleFragments,
- styleFragments.map((fragment) => fragment.text).join("")
- );
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not drop clean text", () => {
- const textParts = [
- {
- start: 0,
- end: 52,
- link: "https://github.com/xPaw/PHP-Source-Query/runs/175079",
- },
- ];
- const styleFragments = [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "https://github.com/xPaw/PHP-Source-Query/runs/175079 here's some text",
- start: 0,
- end: 69,
- },
- ];
-
- const expected = [
- {
- link: "https://github.com/xPaw/PHP-Source-Query/runs/175079",
- start: 0,
- end: 52,
- fragments: [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "https://github.com/xPaw/PHP-Source-Query/runs/175079",
- start: 0,
- end: 52,
- },
- ],
- },
- {
- start: 52,
- end: 69,
- fragments: [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: " here's some text",
- start: 52,
- end: 69,
- },
- ],
- },
- ];
-
- const actual = merge(
- textParts,
- styleFragments,
- styleFragments.map((fragment) => fragment.text).join("")
- );
-
- expect(actual).to.deep.equal(expected);
- });
-});
diff --git a/test/client/js/helpers/ircmessageparser/parseStyle.ts b/test/client/js/helpers/ircmessageparser/parseStyle.ts
deleted file mode 100644
index a79a1e6f..00000000
--- a/test/client/js/helpers/ircmessageparser/parseStyle.ts
+++ /dev/null
@@ -1,1123 +0,0 @@
-import {expect} from "chai";
-import parseStyle from "../../../../../client/js/helpers/ircmessageparser/parseStyle";
-
-describe("parseStyle", () => {
- it("should replace control codes", () => {
- const input = "text\x01with\x04control\x05codes";
- const expected = [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "text withcontrol codes",
-
- start: 0,
- end: 22,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse bold", () => {
- const input = "\x02bold";
- const expected = [
- {
- bold: true,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "bold",
-
- start: 0,
- end: 4,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse strikethrough", () => {
- const input = "\x1estrikethrough text\x1e";
- const expected = [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: true,
- monospace: false,
- text: "strikethrough text",
-
- start: 0,
- end: 18,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse monospace", () => {
- const input = "\x11monospace text\x1e";
- const expected = [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: true,
- text: "monospace text",
-
- start: 0,
- end: 14,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should toggle monospace correctly", () => {
- const input = "toggling \x11on and \x11off and \x11on again\x11";
- const expected = [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "toggling ",
-
- start: 0,
- end: 9,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: true,
- text: "on and ",
-
- start: 9,
- end: 16,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "off and ",
-
- start: 16,
- end: 24,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: true,
- text: "on again",
-
- start: 24,
- end: 32,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse monospace and underline", () => {
- const input =
- "\x1funderline formatting \x11with monospace\x1f no underline \x11 and vanilla";
- const expected = [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: true,
- strikethrough: false,
- monospace: false,
- text: "underline formatting ",
-
- start: 0,
- end: 21,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: true,
- strikethrough: false,
- monospace: true,
- text: "with monospace",
-
- start: 21,
- end: 35,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: true,
- text: " no underline ",
-
- start: 35,
- end: 49,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: " and vanilla",
-
- start: 49,
- end: 61,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse monospace and text colors", () => {
- const input = "\x037,9\x11text with color and monospace\x11\x03";
- const expected = [
- {
- bold: false,
- textColor: 7,
- bgColor: 9,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: true,
- text: "text with color and monospace",
-
- start: 0,
- end: 29,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse strikethrough and italics", () => {
- const input = "\x1ditalic formatting \x1ewith strikethrough\x1d no italic \x1e and vanilla";
- const expected = [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: true,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "italic formatting ",
-
- start: 0,
- end: 18,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: true,
- underline: false,
- strikethrough: true,
- monospace: false,
- text: "with strikethrough",
-
- start: 18,
- end: 36,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: true,
- monospace: false,
- text: " no italic ",
-
- start: 36,
- end: 47,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: " and vanilla",
-
- start: 47,
- end: 59,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse strikethrough and text colors", () => {
- const input = "\x031,2text with color \x1eand strikethrough\x1e\x03";
- const expected = [
- {
- bold: false,
- textColor: 1,
- bgColor: 2,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "text with color ",
-
- start: 0,
- end: 16,
- },
- {
- bold: false,
- textColor: 1,
- bgColor: 2,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: true,
- monospace: false,
- text: "and strikethrough",
-
- start: 16,
- end: 33,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should correctly parse multiple unclosed format tokens", () => {
- const input = "\x1e\x02\x1d\x033,4string with multiple unclosed formats";
- const expected = [
- {
- bold: true,
- textColor: 3,
- bgColor: 4,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: true,
- underline: false,
- strikethrough: true,
- monospace: false,
- text: "string with multiple unclosed formats",
-
- start: 0,
- end: 37,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should toggle strikethrough correctly", () => {
- const input = "toggling \x1eon and \x1eoff and \x1eon again\x1e";
- const expected = [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "toggling ",
-
- start: 0,
- end: 9,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: true,
- monospace: false,
- text: "on and ",
-
- start: 9,
- end: 16,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "off and ",
-
- start: 16,
- end: 24,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: true,
- monospace: false,
- text: "on again",
-
- start: 24,
- end: 32,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse textColor", () => {
- const input = "\x038yellowText";
- const expected = [
- {
- bold: false,
- textColor: 8,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "yellowText",
-
- start: 0,
- end: 10,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse textColor and background", () => {
- const input = "\x034,8yellowBG redText";
- const expected = [
- {
- textColor: 4,
- bgColor: 8,
- hexColor: undefined,
- hexBgColor: undefined,
- bold: false,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "yellowBG redText",
-
- start: 0,
- end: 16,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse extended colors", () => {
- const input = "\x0370,99some text";
- const expected = [
- {
- textColor: 70,
- bgColor: 99,
- hexColor: undefined,
- hexBgColor: undefined,
- bold: false,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "some text",
-
- start: 0,
- end: 9,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse italic", () => {
- const input = "\x1ditalic";
- const expected = [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: true,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "italic",
-
- start: 0,
- end: 6,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse hex colors", () => {
- const input =
- "test \x04FFFFFFnice \x02\x04RES006 \x0303,04\x04ff00FFcolored\x04eeeaFF,001122 background\x04\x03\x02?";
- const expected = [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "test ",
-
- start: 0,
- end: 5,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: "FFFFFF",
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "nice ",
-
- start: 5,
- end: 10,
- },
- {
- bold: true,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "RES006 ",
-
- start: 10,
- end: 17,
- },
- {
- bold: true,
- textColor: 3,
- bgColor: 4,
- hexColor: "FF00FF",
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "colored",
-
- start: 17,
- end: 24,
- },
- {
- bold: true,
- textColor: 3,
- bgColor: 4,
- hexColor: "EEEAFF",
- hexBgColor: "001122",
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: " background",
-
- start: 24,
- end: 35,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "?",
-
- start: 35,
- end: 36,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should reverse and format color", () => {
- const input = "\x032,9text with fg and bg \x16with text reversed";
- const expected = [
- {
- bold: false,
- textColor: 2,
- bgColor: 9,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "text with fg and bg ",
-
- start: 0,
- end: 20,
- },
- {
- bold: false,
- textColor: 9,
- bgColor: 2,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "with text reversed",
-
- start: 20,
- end: 38,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should toggle reverse correctly", () => {
- const input = "\x0305,11text \x16reversed and \x16back again and \x16reversed";
- const expected = [
- {
- bold: false,
- textColor: 5,
- bgColor: 11,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "text ",
-
- start: 0,
- end: 5,
- },
- {
- bold: false,
- textColor: 11,
- bgColor: 5,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "reversed and ",
-
- start: 5,
- end: 18,
- },
- {
- bold: false,
- textColor: 5,
- bgColor: 11,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "back again and ",
-
- start: 18,
- end: 33,
- },
- {
- bold: false,
- textColor: 11,
- bgColor: 5,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "reversed",
-
- start: 33,
- end: 41,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should escape reverse when a new style is applied", () => {
- const input = "\x0311,02text \x16 reversed \x0304,05 and new style";
- const expected = [
- {
- bold: false,
- textColor: 11,
- bgColor: 2,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "text ",
-
- start: 0,
- end: 5,
- },
- {
- bold: false,
- textColor: 2,
- bgColor: 11,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: " reversed ",
-
- start: 5,
- end: 15,
- },
- {
- bold: false,
- textColor: 4,
- bgColor: 5,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: " and new style",
-
- start: 15,
- end: 29,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not reverse if color is specified after reverse tag", () => {
- const input = "\x16\x032,9text with fg and bg";
- const expected = [
- {
- bold: false,
- textColor: 2,
- bgColor: 9,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "text with fg and bg",
-
- start: 0,
- end: 19,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should reverse, bold, and italics", () => {
- const input = "\x034,13\x16\x02some text with \x1ditalics";
- const expected = [
- {
- bold: true,
- textColor: 13,
- bgColor: 4,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "some text with ",
-
- start: 0,
- end: 15,
- },
- {
- bold: true,
- textColor: 13,
- bgColor: 4,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: true,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "italics",
-
- start: 15,
- end: 22,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should carry state correctly forward", () => {
- const input = "\x02bold\x038yellow\x02nonBold\x03default";
- const expected = [
- {
- bold: true,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "bold",
-
- start: 0,
- end: 4,
- },
- {
- bold: true,
- textColor: 8,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "yellow",
-
- start: 4,
- end: 10,
- },
- {
- bold: false,
- textColor: 8,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "nonBold",
-
- start: 10,
- end: 17,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "default",
-
- start: 17,
- end: 24,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should toggle bold correctly", () => {
- const input = "\x02bold\x02 \x02bold\x02";
- const expected = [
- {
- bold: true,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "bold",
-
- start: 0,
- end: 4,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: " ",
-
- start: 4,
- end: 5,
- },
- {
- bold: true,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "bold",
-
- start: 5,
- end: 9,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should reset all styles", () => {
- const input = "\x11\x1e\x02\x034\x16\x1d\x1ffull\x0fnone";
- const expected = [
- {
- bold: true,
- textColor: undefined,
- bgColor: 4, // \x16: fg- and bg- are reversed
- hexColor: undefined,
- hexBgColor: undefined,
- italic: true,
- underline: true,
- strikethrough: true,
- monospace: true,
- text: "full",
-
- start: 0,
- end: 4,
- },
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "none",
-
- start: 4,
- end: 8,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not emit empty fragments", () => {
- const input = "\x031\x031,2\x031\x031,2\x031\x031,2\x03a";
- const expected = [
- {
- bold: false,
- textColor: undefined,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: "a",
-
- start: 0,
- end: 1,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should optimize fragments", () => {
- const rawString = "oh hi test text";
- const colorCode = "\x0312";
- const input = colorCode + rawString.split("").join(colorCode);
- const expected = [
- {
- bold: false,
- textColor: 12,
- bgColor: undefined,
- hexColor: undefined,
- hexBgColor: undefined,
- italic: false,
- underline: false,
- strikethrough: false,
- monospace: false,
- text: rawString,
-
- start: 0,
- end: rawString.length,
- },
- ];
-
- const actual = parseStyle(input);
-
- expect(actual).to.deep.equal(expected);
- });
-});
diff --git a/test/client/js/helpers/localetimeTest.ts b/test/client/js/helpers/localetimeTest.ts
deleted file mode 100644
index c4e90335..00000000
--- a/test/client/js/helpers/localetimeTest.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import {expect} from "chai";
-import localetime from "../../../../client/js/helpers/localetime";
-
-describe("localetime helper", () => {
- it("should render a human-readable date", () => {
- // 12PM in UTC time
- const date = new Date("2014-05-22T12:00:00Z");
-
- // Offset between UTC and local timezone
- const offset = date.getTimezoneOffset() * 60 * 1000;
-
- // Pretend local timezone is UTC by moving the clock of that offset
- const time = date.getTime() + offset;
-
- expect(localetime(time)).to.equal("22 May 2014, 12:00:00");
- });
-});
diff --git a/test/client/js/helpers/parse.ts b/test/client/js/helpers/parse.ts
deleted file mode 100644
index 1a3f108a..00000000
--- a/test/client/js/helpers/parse.ts
+++ /dev/null
@@ -1,589 +0,0 @@
-import {expect} from "chai";
-
-import {mount} from "@vue/test-utils";
-import ParsedMessage from "../../../../client/components/ParsedMessage.vue";
-import {ClientMessage} from "../../../../client/js/types";
-
-function getParsedMessageContents(text: string, message?: any) {
- const wrapper = mount(ParsedMessage, {
- props: {
- text,
- message,
- },
- });
-
- return wrapper.html();
-}
-
-describe("IRC formatted message parser", () => {
- it("should not introduce xss", () => {
- const testCases = [
- {
- input: " ",
- expected:
- '<img onerror=\'location.href="//youtube.com "\'>',
- },
- {
- input: '#&">bug',
- expected:
- '#&">bug ',
- },
- ];
-
- const actual = testCases.map((testCase) => getParsedMessageContents(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should skip all <32 ASCII codes except linefeed", () => {
- const testCases = [
- {
- input: "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1B\x1D\x1D\x1E\x1Ftext\x0Awithcontrolcodestest",
- expected:
- ' text\nwithcontrolcodestest ',
- },
- ];
-
- const actual = testCases.map((testCase) => getParsedMessageContents(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find urls", () => {
- const testCases = [
- {
- input: "irc://irc.example.com/thelounge",
- expected:
- '' +
- "irc://irc.example.com/thelounge" +
- " ",
- },
- {
- input: "www.nooooooooooooooo.com",
- expected:
- '' +
- "www.nooooooooooooooo.com" +
- " ",
- },
- {
- input: "look at https://thelounge.chat/ for more information",
- expected:
- "look at " +
- '' +
- "https://thelounge.chat/" +
- " " +
- " for more information",
- },
- {
- input: "use www.duckduckgo.com for privacy reasons",
- expected:
- "use " +
- '' +
- "www.duckduckgo.com" +
- " " +
- " for privacy reasons",
- },
- {
- input: "svn+ssh://example.org",
- expected:
- '' +
- "svn+ssh://example.org" +
- " ",
- },
- ];
-
- const actual = testCases.map((testCase) => getParsedMessageContents(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("url with a dot parsed correctly", () => {
- const input =
- "bonuspunkt: your URL parser misparses this URL: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644989(v=vs.85).aspx";
- const correctResult =
- "bonuspunkt: your URL parser misparses this URL: " +
- '' +
- "https://msdn.microsoft.com/en-us/library/windows/desktop/ms644989(v=vs.85).aspx" +
- " ";
-
- const actual = getParsedMessageContents(input);
-
- expect(actual).to.deep.equal(correctResult);
- });
-
- it("should balance brackets", () => {
- const testCases = [
- {
- input: "",
- expected:
- "<" +
- '' +
- "https://theos.kyriasis.com/~kyrias/stats/archlinux.html" +
- " " +
- ">",
- },
- {
- input: "abc (www.example.com)",
- expected:
- "abc (" +
- '' +
- "www.example.com" +
- " " +
- ")",
- },
- {
- input: "http://example.com/Test_(Page)",
- expected:
- '' +
- "http://example.com/Test_(Page)" +
- " ",
- },
- {
- input: "www.example.com/Test_(Page)",
- expected:
- '' +
- "www.example.com/Test_(Page)" +
- " ",
- },
- ];
-
- const actual = testCases.map((testCase) => getParsedMessageContents(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not find urls", () => {
- const testCases = [
- {
- input: "text www. text",
- expected: "text www. text",
- },
- {
- input: "http://.",
- expected: "http://.",
- },
- ];
-
- const actual = testCases.map((testCase) => getParsedMessageContents(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find channels", () => {
- const testCases = [
- {
- input: "#a",
- expected:
- '' +
- "#a" +
- " ",
- },
- {
- input: "#test",
- expected:
- '' +
- "#test" +
- " ",
- },
- {
- input: "#äöü",
- expected:
- '' +
- "#äöü" +
- " ",
- },
- {
- input: "inline #channel text",
- expected:
- "inline " +
- '' +
- "#channel" +
- " " +
- " text",
- },
- {
- input: "#1,000",
- expected:
- '' +
- "#1,000" +
- " ",
- },
- {
- input: "@#a",
- expected:
- "@" +
- '' +
- "#a" +
- " ",
- },
- ];
-
- const actual = testCases.map((testCase) => getParsedMessageContents(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not find channels", () => {
- const testCases = [
- {
- input: "hi#test",
- expected: "hi#test",
- },
- {
- input: "#",
- expected: "#",
- },
- ];
-
- const actual = testCases.map((testCase) => getParsedMessageContents(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- [
- {
- name: "bold",
- input: "\x02bold",
- expected: 'bold ',
- },
- {
- name: "foreground color",
- input: "\x038yellowText",
- expected: 'yellowText ',
- },
- {
- name: "foreground and background colors (white)",
- input: "\x030,0white,white",
- expected: 'white,white ',
- },
- {
- name: "foreground and background colors",
- input: "\x034,8yellowBGredText",
- expected: 'yellowBGredText ',
- },
- {
- name: "hex foreground color",
- input: "\x04663399rebeccapurple",
- expected: 'rebeccapurple ',
- },
- {
- name: "hex foreground and background colors",
- input: "\x04415364,ff9e18The Lounge",
- expected: 'The Lounge ',
- },
- {
- name: "italic",
- input: "\x1ditalic",
- expected: 'italic ',
- },
- {
- name: "underline",
- input: "\x1funderline",
- expected: 'underline ',
- },
- {
- name: "strikethrough",
- input: "\x1estrikethrough",
- expected: 'strikethrough ',
- },
- {
- name: "monospace",
- input: "\x11monospace",
- expected: 'monospace ',
- },
- {
- name: "reverse with foreground and background colors",
- input: "\x0313,1fg and bg \x16and reversed",
- expected:
- 'fg and bg ' +
- 'and reversed ',
- },
- {
- name: "toggle reverse with foreground and background colors",
- input: "\x0305,11text \x16reversed and \x16back again and \x16reversed",
- expected:
- 'text ' +
- 'reversed and ' +
- 'back again and ' +
- 'reversed ',
- },
- {
- name: "escape reverse when new colors are applied",
- input: "\x0311,02text \x16 reversed \x0304,05 and new style",
- expected:
- 'text ' +
- ' reversed ' +
- ' and new style ',
- },
- {
- name: "resets",
- input: "\x02bold\x038yellow\x02nonBold\x03default",
- expected:
- 'bold ' +
- 'yellow ' +
- 'nonBold ' +
- "default",
- },
- {
- name: "duplicates",
- input: "\x02bold\x02 \x02bold\x02",
- expected:
- 'bold ' + " " + 'bold ',
- },
- ].forEach(({name, input, expected}) => {
- it(`should handle style characters: ${name}`, () => {
- expect(getParsedMessageContents(input)).to.equal(expected);
- });
- });
-
- it("should find nicks", async () => {
- const testCases = [
- {
- message: {
- users: ["MaxLeiter"],
- },
- input: "test, MaxLeiter",
- expected:
- "test, " +
- '' +
- "MaxLeiter" +
- " ",
- },
- ];
-
- const actual = await Promise.all(
- testCases.map((testCase) => getParsedMessageContents(testCase.input, testCase.message))
- );
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not find nicks", () => {
- const testCases = [
- {
- users: ["MaxLeiter, test"],
- input: "#test-channelMaxLeiter",
- expected:
- '' +
- "#test-channelMaxLeiter" +
- " ",
- },
- {
- users: ["MaxLeiter, test"],
- input: "https://www.MaxLeiter.com/test",
- expected:
- '' +
- "https://www.MaxLeiter.com/test" +
- " ",
- },
- ];
-
- const actual = testCases.map((testCase) => getParsedMessageContents(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should go bonkers like mirc", () => {
- const testCases = [
- {
- input: "\x02irc\x0f://\x1dirc.example.com\x0f/\x034,8thelounge",
- expected:
- '' +
- 'irc ' +
- "://" +
- 'irc.example.com ' +
- "/" +
- 'thelounge ' +
- " ",
- },
- {
- input: "\x02#\x038,9thelounge",
- expected:
- '' +
- '# ' +
- 'thelounge ' +
- " ",
- },
- ];
-
- const actual = testCases.map((testCase) => getParsedMessageContents(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- // Emoji
- [
- {
- name: "in text",
- input: "Hello💬",
- expected:
- 'Hello💬 ',
- },
- {
- name: "complicated zero-join-width emoji",
- input: "🤦🏿♀️",
- expected:
- '🤦🏿♀️ ',
- },
- {
- name: "unicode 12 emojis",
- input: "🧘🏿👨👨👧👧",
- expected:
- '🧘🏿 👨👨👧👧 ',
- },
- {
- name: "unicode 12 emojis with multiple modifiers",
- input: "👩🏾🤝👨🏽",
- expected: '👩🏾🤝👨🏽 ',
- },
- {
- name: "with modifiers",
- input: "🤷♀️",
- expected:
- '🤷♀️ ',
- },
- {
- name: "with emoji variant selector",
- input: "\u{2695}\u{FE0F}",
- expected:
- '\u{2695}\u{FE0F} ',
- },
- {
- name: "with text variant selector",
- input: "\u{2695}\u{FE0E}",
- expected: "\u{2695}\u{FE0E}", // this does not match because FE0E is specifically a text variant
- },
- {
- name: "without variant selector",
- input: "\u{2695}",
- expected: "\u{2695}", // this does not match because emoji-regex expects \uFE0F as per the emoji specification
- },
- {
- // FIXME: These multiple `span`s should be optimized into a single one. See https://github.com/thelounge/thelounge/issues/1783
- name: "wrapped in style",
- input: "Super \x034💚 green!",
- expected:
- 'Super 💚 green! ',
- },
- {
- name: "wrapped in URLs",
- input: "https://i.❤️.thelounge.chat",
- // FIXME: Emoji in text should be `❤️ `. See https://github.com/thelounge/thelounge/issues/1784
- expected:
- 'https://i.❤️.thelounge.chat ',
- },
- {
- name: "wrapped in channels",
- input: "#i❤️thelounge",
- // FIXME: Emoji in text should be `❤️ `. See https://github.com/thelounge/thelounge/issues/1784
- expected:
- '#i❤️thelounge ',
- },
- ].forEach(({name, input, expected}) => {
- it(`should find emoji: ${name}`, () => {
- expect(getParsedMessageContents(input)).to.equal(expected);
- });
- });
-
- it("should optimize generated html", () => {
- const testCases = [
- {
- input: 'test \x0312#\x0312\x0312"te\x0312st\x0312\x0312\x0312\x0312\x0312\x0312\x0312\x0312\x0312\x0312\x0312a',
- expected:
- "test " +
- '' +
- '#"testa ' +
- " ",
- },
- ];
-
- const actual = testCases.map((testCase) => getParsedMessageContents(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should trim common protocols", () => {
- const testCases = [
- {
- input: "like..http://example.com",
- expected:
- "like.." +
- '' +
- "http://example.com" +
- " ",
- },
- {
- input: "like..HTTP://example.com",
- expected:
- "like.." +
- '' +
- "HTTP://example.com" +
- " ",
- },
- ];
-
- const actual = testCases.map((testCase) => getParsedMessageContents(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not find channel in fragment", () => {
- const testCases = [
- {
- input: "http://example.com/#hash",
- expected:
- '' +
- "http://example.com/#hash" +
- " ",
- },
- ];
-
- const actual = testCases.map((testCase) => getParsedMessageContents(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not overlap parts", () => {
- const input = "Url: http://example.com/path Channel: ##channel";
- const actual = getParsedMessageContents(input);
-
- expect(actual).to.equal(
- 'Url: http://example.com/path ' +
- 'Channel: ##channel '
- );
- });
-
- it("should handle overlapping parts by using first starting", () => {
- const input = "#test-https://example.com";
- const actual = getParsedMessageContents(input);
-
- expect(actual).to.equal(
- '' +
- "#test-https://example.com" +
- " "
- );
- });
-
- it("should find links separated by tab character", () => {
- const input = "example.com\texample.org";
- const actual = getParsedMessageContents(input);
-
- expect(actual).to.equal(
- 'example.com ' +
- ' example.org '
- );
- });
-});
diff --git a/test/client/js/helpers/parseIrcUri.ts b/test/client/js/helpers/parseIrcUri.ts
deleted file mode 100644
index 5f977d9d..00000000
--- a/test/client/js/helpers/parseIrcUri.ts
+++ /dev/null
@@ -1,92 +0,0 @@
-import {expect} from "chai";
-import parseIrcUri from "../../../../client/js/helpers/parseIrcUri";
-
-describe("parseIrcUri helper", function () {
- it("should parse irc:// without port", function () {
- expect(parseIrcUri("irc://example.com")).to.deep.equal({
- tls: false,
- name: "example.com",
- host: "example.com",
- port: "6667",
- join: "",
- });
- });
-
- it("should parse ircs:// without port", function () {
- expect(parseIrcUri("ircs://example.com")).to.deep.equal({
- tls: true,
- name: "example.com",
- host: "example.com",
- port: "6697",
- join: "",
- });
- });
-
- it("should parse irc:// with port", function () {
- expect(parseIrcUri("irc://example.com:1337")).to.deep.equal({
- tls: false,
- name: "example.com",
- host: "example.com",
- port: "1337",
- join: "",
- });
- });
-
- it("should parse ircs:// with port", function () {
- expect(parseIrcUri("ircs://example.com:1337")).to.deep.equal({
- tls: true,
- name: "example.com",
- host: "example.com",
- port: "1337",
- join: "",
- });
- });
-
- it("should not parse invalid port", function () {
- expect(parseIrcUri("ircs://example.com:lol")).to.deep.equal({});
- });
-
- it("should not parse plus in port", function () {
- expect(parseIrcUri("irc://example.com:+6697")).to.deep.equal({});
- });
-
- it("should not channel on empty query and hash", function () {
- const obj = {
- tls: false,
- name: "example.com",
- host: "example.com",
- port: "6667",
- join: "",
- };
-
- expect(parseIrcUri("irc://example.com#")).to.deep.equal(obj);
- expect(parseIrcUri("irc://example.com/")).to.deep.equal(obj);
- expect(parseIrcUri("irc://example.com/#")).to.deep.equal(obj);
- });
-
- it("should parse multiple channels", function () {
- const obj = {
- tls: true,
- name: "example.com",
- host: "example.com",
- port: "1337",
- join: "#channel,channel2",
- };
-
- expect(parseIrcUri("ircs://example.com:1337#channel,channel2")).to.deep.equal(obj);
- expect(parseIrcUri("ircs://example.com:1337/#channel,channel2")).to.deep.equal(obj);
-
- obj.join = "channel,channel2";
- expect(parseIrcUri("ircs://example.com:1337/channel,channel2")).to.deep.equal(obj);
-
- obj.join = "chan,#chan2,#chan3";
- expect(parseIrcUri("ircs://example.com:1337/chan,#chan2,#chan3")).to.deep.equal(obj);
-
- obj.join = "&chan,@chan2,#chan3";
- expect(parseIrcUri("ircs://example.com:1337/&chan,@chan2,#chan3")).to.deep.equal(obj);
-
- // URL() drops empty hash
- obj.join = "chan";
- expect(parseIrcUri("ircs://example.com:1337/chan#")).to.deep.equal(obj);
- });
-});
diff --git a/test/client/js/helpers/roundBadgeNumberTest.ts b/test/client/js/helpers/roundBadgeNumberTest.ts
deleted file mode 100644
index 1b26ee91..00000000
--- a/test/client/js/helpers/roundBadgeNumberTest.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import {expect} from "chai";
-import roundBadgeNumber from "../../../../client/js/helpers/roundBadgeNumber";
-
-describe("roundBadgeNumber helper", function () {
- it("should return any number under 1000 as a string", function () {
- expect(roundBadgeNumber(123)).to.equal("123");
- });
-
- it("should return numbers above 999 in thousands", function () {
- expect(roundBadgeNumber(1000)).to.be.equal("1.0k");
- });
-
- it("should round and not floor", function () {
- expect(roundBadgeNumber(9999)).to.be.equal("10.0k");
- });
-
- it("should always include a single digit when rounding up", function () {
- expect(roundBadgeNumber(1234)).to.be.equal("1.2k");
- expect(roundBadgeNumber(12345)).to.be.equal("12.3k");
- expect(roundBadgeNumber(123456)).to.be.equal("123.4k");
- });
-});
diff --git a/test/commands/mode.ts b/test/commands/mode.ts
deleted file mode 100644
index c9e1ba9a..00000000
--- a/test/commands/mode.ts
+++ /dev/null
@@ -1,149 +0,0 @@
-import {expect} from "chai";
-import Chan from "../../server/models/chan";
-import {ChanType} from "../../shared/types/chan";
-import ModeCommand from "../../server/plugins/inputs/mode";
-
-describe("Commands", function () {
- describe("/mode", function () {
- const channel = new Chan({
- name: "#thelounge",
- });
-
- const lobby = new Chan({
- name: "Network Lobby",
- type: ChanType.LOBBY,
- });
-
- const testableNetwork = {
- firstCommand: null,
- lastCommand: null,
- nick: "xPaw",
- irc: {
- network: {
- supports(type: string) {
- if (type.toUpperCase() === "MODES") {
- return "4";
- }
- },
- },
- raw(...args: string[]) {
- testableNetwork.firstCommand = testableNetwork.lastCommand;
- testableNetwork.lastCommand = args.join(" ");
- },
- },
- } as {
- firstCommand: string | null;
- lastCommand: string | null;
- nick: string;
- irc: {
- network: {
- supports(type: string): string;
- };
- raw(...args: string[]): void;
- };
- };
-
- const testableNetworkNoSupports = Object.assign({}, testableNetwork, {
- irc: {
- network: {
- supports() {
- return null;
- },
- },
- raw(...args: string[]) {
- testableNetworkNoSupports.firstCommand = testableNetworkNoSupports.lastCommand;
- testableNetworkNoSupports.lastCommand = args.join(" ");
- },
- },
- });
-
- function modeCommandInputCall(net, chan, cmd, args) {
- ModeCommand.input.call({} as any, net as any, chan, cmd, Array.from(args));
- }
-
- it("should not mess with the given target", function () {
- const test = function (expected: string, args: string[]) {
- modeCommandInputCall(testableNetwork, channel, "mode", Array.from(args));
- expect(testableNetwork.lastCommand).to.equal(expected);
-
- modeCommandInputCall(testableNetwork, lobby, "mode", args);
- expect(testableNetwork.lastCommand).to.equal(expected);
- };
-
- test("MODE xPaw +i", ["xPaw", "+i"]);
- test("MODE xPaw -w", ["xPaw", "-w"]);
- test("MODE #thelounge +o xPaw", ["#thelounge", "+o", "xPaw"]);
- test("MODE #thelounge -v xPaw", ["#thelounge", "-v", "xPaw"]);
- test("MODE #thelounge +o-o xPaw Max-P", ["#thelounge", "+o-o", "xPaw", "Max-P"]);
- test("MODE #thelounge", ["#thelounge"]);
- });
-
- it("should assume target if none given", function () {
- modeCommandInputCall(testableNetwork, channel, "mode", []);
- expect(testableNetwork.lastCommand).to.equal("MODE #thelounge");
-
- modeCommandInputCall(testableNetwork, lobby, "mode", []);
- expect(testableNetwork.lastCommand).to.equal("MODE xPaw");
-
- modeCommandInputCall(testableNetwork, channel, "mode", ["+b"]);
- expect(testableNetwork.lastCommand).to.equal("MODE #thelounge +b");
-
- modeCommandInputCall(testableNetwork, lobby, "mode", ["+b"]);
- expect(testableNetwork.lastCommand).to.equal("MODE xPaw +b");
-
- modeCommandInputCall(testableNetwork, channel, "mode", ["-o", "hey"]);
- expect(testableNetwork.lastCommand).to.equal("MODE #thelounge -o hey");
-
- modeCommandInputCall(testableNetwork, lobby, "mode", ["-i", "idk"]);
- expect(testableNetwork.lastCommand).to.equal("MODE xPaw -i idk");
- });
-
- it("should support shorthand commands", function () {
- modeCommandInputCall(testableNetwork, channel, "op", ["xPaw"]);
- expect(testableNetwork.lastCommand).to.equal("MODE #thelounge +o xPaw");
-
- modeCommandInputCall(testableNetwork, channel, "deop", ["xPaw"]);
- expect(testableNetwork.lastCommand).to.equal("MODE #thelounge -o xPaw");
-
- modeCommandInputCall(testableNetwork, channel, "hop", ["xPaw"]);
- expect(testableNetwork.lastCommand).to.equal("MODE #thelounge +h xPaw");
-
- modeCommandInputCall(testableNetwork, channel, "dehop", ["xPaw"]);
- expect(testableNetwork.lastCommand).to.equal("MODE #thelounge -h xPaw");
-
- modeCommandInputCall(testableNetwork, channel, "voice", ["xPaw"]);
- expect(testableNetwork.lastCommand).to.equal("MODE #thelounge +v xPaw");
-
- modeCommandInputCall(testableNetwork, channel, "devoice", ["xPaw"]);
- expect(testableNetwork.lastCommand).to.equal("MODE #thelounge -v xPaw");
- });
-
- it("should use ISUPPORT MODES on shorthand commands", function () {
- modeCommandInputCall(testableNetwork, channel, "voice", ["xPaw", "Max-P"]);
- expect(testableNetwork.lastCommand).to.equal("MODE #thelounge +vv xPaw Max-P");
-
- // since the limit for modes on tests is 4, it should send two commands
- modeCommandInputCall(testableNetwork, channel, "devoice", [
- "xPaw",
- "Max-P",
- "hey",
- "idk",
- "thelounge",
- ]);
- expect(testableNetwork.firstCommand).to.equal(
- "MODE #thelounge -vvvv xPaw Max-P hey idk"
- );
- expect(testableNetwork.lastCommand).to.equal("MODE #thelounge -v thelounge");
- });
-
- it("should fallback to all modes at once for shorthand commands", function () {
- modeCommandInputCall(testableNetworkNoSupports, channel, "voice", ["xPaw"]);
- expect(testableNetworkNoSupports.lastCommand).to.equal("MODE #thelounge +v xPaw");
-
- modeCommandInputCall(testableNetworkNoSupports, channel, "devoice", ["xPaw", "Max-P"]);
- expect(testableNetworkNoSupports.lastCommand).to.equal(
- "MODE #thelounge -vv xPaw Max-P"
- );
- });
- });
-});
diff --git a/test/fixtures/.gitignore b/test/fixtures/.gitignore
deleted file mode 100644
index 88823c3f..00000000
--- a/test/fixtures/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# Files that may be generated by tests
-.thelounge/storage/
-.thelounge/logs/
-.thelounge/certificates/
-.thelounge/sts-policies.json
-
-# Fixtures contain fake packages, stored in a fake node_modules folder
-!.thelounge/packages/node_modules/
diff --git a/test/fixtures/.lounge/config.js b/test/fixtures/.lounge/config.js
new file mode 100644
index 00000000..3f900589
--- /dev/null
+++ b/test/fixtures/.lounge/config.js
@@ -0,0 +1,5 @@
+var config = require("../../../defaults/config.js");
+
+config.prefetch = true;
+
+module.exports = config;
diff --git a/test/fixtures/.thelounge/config.js b/test/fixtures/.thelounge/config.js
deleted file mode 100644
index 2c7dfd61..00000000
--- a/test/fixtures/.thelounge/config.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-
-import config from "../../../defaults/config.js";
-
-config.defaults.name = "Example IRC Server";
-config.defaults.host = "irc.example.com";
-config.public = true;
-config.prefetch = true;
-// @ts-ignore
-config.host = config.bind = "127.0.0.1";
-config.port = 61337;
-config.transports = ["websocket"];
-
-module.exports = config;
diff --git a/test/fixtures/.thelounge/packages/node_modules/thelounge-package-foo/index.js b/test/fixtures/.thelounge/packages/node_modules/thelounge-package-foo/index.js
deleted file mode 100644
index 34ae57a2..00000000
--- a/test/fixtures/.thelounge/packages/node_modules/thelounge-package-foo/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-
-module.exports = {
- onServerStart(apis) {
- apis.Stylesheets.addFile("style.css");
- },
-};
diff --git a/test/fixtures/.thelounge/packages/node_modules/thelounge-package-foo/package.json b/test/fixtures/.thelounge/packages/node_modules/thelounge-package-foo/package.json
deleted file mode 100644
index 0f286bc4..00000000
--- a/test/fixtures/.thelounge/packages/node_modules/thelounge-package-foo/package.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "name": "thelounge-package-foo",
- "private": true,
- "main": "index.js",
- "version": "dummy",
- "thelounge": {
- "type": "package"
- },
- "keywords": [
- "thelounge",
- "thelounge-package"
- ]
-}
diff --git a/test/fixtures/.thelounge/packages/package.json b/test/fixtures/.thelounge/packages/package.json
deleted file mode 100644
index 8e5d9abc..00000000
--- a/test/fixtures/.thelounge/packages/package.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "private": true,
- "dependencies": {
- "thelounge-package-foo": "*"
- }
-}
diff --git a/test/fixtures/.thelounge/vapid.json b/test/fixtures/.thelounge/vapid.json
deleted file mode 100644
index 8ef3fab6..00000000
--- a/test/fixtures/.thelounge/vapid.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "publicKey": "BM0eTDpvDnH7ewlHuXWcPTE1NjlJ06XWIS1cQeBTZmsg4EDx5sOpY7kdX1pniTo8RakL3UdfFuIbC8_zog_BWIM",
- "privateKey": "MDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTY"
-}
diff --git a/test/fixtures/env.js b/test/fixtures/env.js
new file mode 100644
index 00000000..08aafaf0
--- /dev/null
+++ b/test/fixtures/env.js
@@ -0,0 +1,2 @@
+var home = require("path").join(__dirname, ".lounge");
+require("../../src/helper").setHome(home);
diff --git a/test/fixtures/env.ts b/test/fixtures/env.ts
deleted file mode 100644
index 55100767..00000000
--- a/test/fixtures/env.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import * as path from "path";
-const home = path.join(__dirname, ".thelounge");
-
-import config from "../../server/config";
-config.setHome(home);
diff --git a/test/models/chan.js b/test/models/chan.js
new file mode 100644
index 00000000..fe85f927
--- /dev/null
+++ b/test/models/chan.js
@@ -0,0 +1,90 @@
+"use strict";
+
+var expect = require("chai").expect;
+
+var Chan = require("../../src/models/chan");
+var User = require("../../src/models/user");
+
+function makeUser(name) {
+ // TODO Update/Fix this when User constructor gets reworked (see its TODO)
+ return new User({nick: name, mode: ""});
+}
+
+function getUserNames(chan) {
+ return chan.users.map(function(u) {
+ return u.name;
+ });
+}
+
+describe("Chan", function() {
+ describe("#sortUsers(irc)", function() {
+ var fullNetworkPrefix = [
+ {symbol: "~", mode: "q"},
+ {symbol: "&", mode: "a"},
+ {symbol: "@", mode: "o"},
+ {symbol: "%", mode: "h"},
+ {symbol: "+", mode: "v"}
+ ];
+
+ it("should sort a simple user list", function() {
+ var chan = new Chan({users: [
+ "JocelynD", "YaManicKill", "astorije", "xPaw", "Max-P"
+ ].map(makeUser)});
+ chan.sortUsers({network: {options: {PREFIX: fullNetworkPrefix}}});
+
+ expect(getUserNames(chan)).to.deep.equal([
+ "astorije", "JocelynD", "Max-P", "xPaw", "YaManicKill"
+ ]);
+ });
+
+ it("should group users by modes", function() {
+ var chan = new Chan({users: [
+ new User({name: "JocelynD", mode: "&"}),
+ new User({name: "YaManicKill", mode: "+"}),
+ new User({name: "astorije", mode: "%"}),
+ new User({name: "xPaw", mode: "~"}),
+ new User({name: "Max-P", mode: "@"}),
+ ]});
+ chan.sortUsers({network: {options: {PREFIX: fullNetworkPrefix}}});
+
+ expect(getUserNames(chan)).to.deep.equal([
+ "xPaw", "JocelynD", "Max-P", "astorije", "YaManicKill"
+ ]);
+ });
+
+ it("should sort a mix of users and modes", function() {
+ var chan = new Chan({users: [
+ new User({name: "JocelynD"}),
+ new User({name: "YaManicKill", mode: "@"}),
+ new User({name: "astorije"}),
+ new User({name: "xPaw"}),
+ new User({name: "Max-P", mode: "@"}),
+ ]});
+ chan.sortUsers({network: {options: {PREFIX: fullNetworkPrefix}}});
+
+ expect(getUserNames(chan)).to.deep.equal(
+ ["Max-P", "YaManicKill", "astorije", "JocelynD", "xPaw"]
+ );
+ });
+
+ it("should be case-insensitive", function() {
+ var chan = new Chan({users: ["aB", "Ad", "AA", "ac"].map(makeUser)});
+ chan.sortUsers({network: {options: {PREFIX: fullNetworkPrefix}}});
+
+ expect(getUserNames(chan)).to.deep.equal(["AA", "aB", "ac", "Ad"]);
+ });
+
+ it("should parse special characters successfully", function() {
+ var chan = new Chan({users: [
+ "[foo", "]foo", "(foo)", "{foo}", "", "_foo", "@foo", "^foo",
+ "&foo", "!foo", "+foo", "Foo"
+ ].map(makeUser)});
+ chan.sortUsers({network: {options: {PREFIX: fullNetworkPrefix}}});
+
+ expect(getUserNames(chan)).to.deep.equal([
+ "!foo", "&foo", "(foo)", "+foo", "", "@foo", "[foo", "]foo",
+ "^foo", "_foo", "Foo", "{foo}"
+ ]);
+ });
+ });
+});
diff --git a/test/models/chan.ts b/test/models/chan.ts
deleted file mode 100644
index 29a0d58c..00000000
--- a/test/models/chan.ts
+++ /dev/null
@@ -1,285 +0,0 @@
-import {expect} from "chai";
-
-import Chan from "../../server/models/chan";
-import Msg from "../../server/models/msg";
-import Network from "../../server/models/network";
-import Prefix from "../../server/models/prefix";
-import User from "../../server/models/user";
-describe("Chan", function () {
- const network = {
- network: {
- options: {
- PREFIX: [
- {symbol: "~", mode: "q"},
- {symbol: "&", mode: "a"},
- {symbol: "@", mode: "o"},
- {symbol: "%", mode: "h"},
- {symbol: "+", mode: "v"},
- ],
- },
- },
- };
-
- const prefixLookup = {modeToSymbol: {}} as Prefix;
-
- network.network.options.PREFIX.forEach((mode) => {
- prefixLookup.modeToSymbol[mode.mode] = mode.symbol;
- });
-
- describe("#findMessage(id)", function () {
- const chan = new Chan({
- messages: [
- new Msg({id: 1}),
- new Msg({
- id: 2,
- text: "Message to be found",
- }),
- new Msg(),
- ],
- });
-
- it("should find a message in the list of messages", function () {
- expect(chan.findMessage(2)?.text).to.equal("Message to be found");
- });
-
- it("should not find a message that does not exist", function () {
- expect(chan.findMessage(42)).to.be.undefined;
- });
- });
-
- describe("#setUser(user)", function () {
- it("should make key lowercase", function () {
- const chan = new Chan();
- chan.setUser(new User({nick: "TestUser"}));
-
- expect(chan.users.has("testuser")).to.be.true;
- });
-
- it("should update user object", function () {
- const chan = new Chan();
- chan.setUser(new User({nick: "TestUser"}, prefixLookup));
- chan.setUser(new User({nick: "TestUseR", modes: ["o"]}, prefixLookup));
- const user = chan.getUser("TestUSER");
-
- expect(user.mode).to.equal("@");
- });
- });
-
- describe("#getUser(nick)", function () {
- it("should returning existing object", function () {
- const chan = new Chan();
- chan.setUser(new User({nick: "TestUseR", modes: ["o"]}, prefixLookup));
- const user = chan.getUser("TestUSER");
-
- expect(user.mode).to.equal("@");
- });
-
- it("should make new User object if not found", function () {
- const chan = new Chan();
- const user = chan.getUser("very-testy-user");
-
- expect(user.nick).to.equal("very-testy-user");
- });
- });
-
- describe("#getSortedUsers(irc)", function () {
- const getUserNames = function (chan: Chan) {
- return chan.getSortedUsers(network as Network["irc"]).map((u) => u.nick);
- };
-
- it("returns unsorted list on null irc object", function () {
- const chan = new Chan();
- ["JocelynD", "YaManicKill", "astorije", "xPaw", "Max-P"].forEach((nick) =>
- chan.setUser(new User({nick}))
- );
-
- expect(chan.getSortedUsers().map((u) => u.nick)).to.deep.equal([
- "JocelynD",
- "YaManicKill",
- "astorije",
- "xPaw",
- "Max-P",
- ]);
- });
-
- it("should sort a simple user list", function () {
- const chan = new Chan();
- ["JocelynD", "YaManicKill", "astorije", "xPaw", "Max-P"].forEach((nick) =>
- chan.setUser(new User({nick}, prefixLookup))
- );
-
- expect(getUserNames(chan)).to.deep.equal([
- "astorije",
- "JocelynD",
- "Max-P",
- "xPaw",
- "YaManicKill",
- ]);
- });
-
- it("should group users by modes", function () {
- const chan = new Chan();
- chan.setUser(new User({nick: "JocelynD", modes: ["a", "o"]}, prefixLookup));
- chan.setUser(new User({nick: "YaManicKill", modes: ["v"]}, prefixLookup));
- chan.setUser(new User({nick: "astorije", modes: ["h"]}, prefixLookup));
- chan.setUser(new User({nick: "xPaw", modes: ["q"]}, prefixLookup));
- chan.setUser(new User({nick: "Max-P", modes: ["o"]}, prefixLookup));
-
- expect(getUserNames(chan)).to.deep.equal([
- "xPaw",
- "JocelynD",
- "Max-P",
- "astorije",
- "YaManicKill",
- ]);
- });
-
- it("should sort a mix of users and modes", function () {
- const chan = new Chan();
- chan.setUser(new User({nick: "JocelynD"}, prefixLookup));
- chan.setUser(new User({nick: "YaManicKill", modes: ["o"]}, prefixLookup));
- chan.setUser(new User({nick: "astorije"}, prefixLookup));
- chan.setUser(new User({nick: "xPaw"}, prefixLookup));
- chan.setUser(new User({nick: "Max-P", modes: ["o"]}, prefixLookup));
-
- expect(getUserNames(chan)).to.deep.equal([
- "Max-P",
- "YaManicKill",
- "astorije",
- "JocelynD",
- "xPaw",
- ]);
- });
-
- it("should be case-insensitive", function () {
- const chan = new Chan();
- ["aB", "Ad", "AA", "ac"].forEach((nick) =>
- chan.setUser(new User({nick}, prefixLookup))
- );
-
- expect(getUserNames(chan)).to.deep.equal(["AA", "aB", "ac", "Ad"]);
- });
-
- it("should parse special characters successfully", function () {
- const chan = new Chan();
- [
- "[foo",
- "]foo",
- "(foo)",
- "{foo}",
- "",
- "_foo",
- "@foo",
- "^foo",
- "&foo",
- "!foo",
- "+foo",
- "Foo",
- ].forEach((nick) => chan.setUser(new User({nick}, prefixLookup)));
-
- expect(getUserNames(chan)).to.deep.equal([
- "!foo",
- "&foo",
- "(foo)",
- "+foo",
- "",
- "@foo",
- "[foo",
- "]foo",
- "^foo",
- "_foo",
- "Foo",
- "{foo}",
- ]);
- });
- });
-
- describe("#getFilteredClone(lastActiveChannel, lastMessage)", function () {
- it("should keep necessary properties", function () {
- const chan = new Chan();
-
- expect(chan.getFilteredClone()).to.be.an("object").that.has.all.keys(
- "firstUnread",
- "highlight",
- "id",
- "key",
- "messages",
- "muted",
- "totalMessages",
- "name",
- "state",
- "topic",
- "type",
- "unread",
- // the following are there in special cases, need to fix the types
- "num_users",
- "special",
- "closed",
- "data"
- );
- });
-
- it("should send only last message for non active channel", function () {
- const chan = new Chan({
- id: 1337,
- messages: [
- new Msg({id: 10}),
- new Msg({id: 11}),
- new Msg({id: 12}),
- new Msg({id: 13}),
- ],
- });
-
- expect(chan.id).to.equal(1337);
-
- const messages = chan.getFilteredClone(999).messages;
-
- expect(messages).to.have.lengthOf(1);
- expect(messages[0].id).to.equal(13);
- });
-
- it("should send more messages for active channel", function () {
- const chan = new Chan({
- id: 1337,
- messages: [
- new Msg({id: 10}),
- new Msg({id: 11}),
- new Msg({id: 12}),
- new Msg({id: 13}),
- ],
- });
-
- expect(chan.id).to.equal(1337);
-
- const messages = chan.getFilteredClone(1337).messages;
-
- expect(messages).to.have.lengthOf(4);
- expect(messages[0].id).to.equal(10);
- expect(messages[3].id).to.equal(13);
-
- expect(chan.getFilteredClone(true).messages).to.have.lengthOf(4);
- });
-
- it("should only send new messages", function () {
- const chan = new Chan({
- id: 1337,
- messages: [
- new Msg({id: 10}),
- new Msg({id: 11}),
- new Msg({id: 12}),
- new Msg({id: 13}),
- new Msg({id: 14}),
- new Msg({id: 15}),
- ],
- });
-
- expect(chan.id).to.equal(1337);
-
- const messages = chan.getFilteredClone(1337, 12).messages;
-
- expect(messages).to.have.lengthOf(3);
- expect(messages[0].id).to.equal(13);
- expect(messages[2].id).to.equal(15);
- });
- });
-});
diff --git a/test/models/msg.ts b/test/models/msg.ts
deleted file mode 100644
index 93f26d37..00000000
--- a/test/models/msg.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import {expect} from "chai";
-
-import Msg from "../../server/models/msg";
-import User from "../../server/models/user";
-import {LinkPreview} from "../../shared/types/msg";
-
-describe("Msg", function () {
- ["from", "target"].forEach((prop) => {
- it(`should keep a copy of the original user in the \`${prop}\` property`, function () {
- const prefixLookup = {modeToSymbol: {a: "&", o: "@"}};
- const user = new User(
- {
- modes: ["o"],
- nick: "foo",
- },
- prefixLookup as any
- );
- const msg = new Msg({[prop]: user});
-
- // Mutating the user
- user.setModes(["a"], prefixLookup as any);
- user.nick = "bar";
-
- // Message's `.from`/etc. should still refer to the original user
- expect(msg[prop]).to.deep.equal({mode: "@", nick: "foo"});
- });
- });
-
- describe("#findPreview(link)", function () {
- const msg = new Msg({
- previews: [
- {
- body: "",
- head: "Example Domain",
- link: "https://example.org/",
- thumb: "",
- type: "link",
- shown: true,
- },
- {
- body: "",
- head: "The Lounge",
- link: "https://thelounge.chat/",
- thumb: "",
- type: "link",
- shown: true,
- },
- ] as LinkPreview[],
- });
-
- it("should find a preview given an existing link", function () {
- expect(msg.findPreview("https://thelounge.chat/")?.head).to.equal("The Lounge");
- });
-
- it("should not find a preview that does not exist", function () {
- expect(msg.findPreview("https://github.com/thelounge/thelounge")).to.be.undefined;
- });
- });
-});
diff --git a/test/models/network.js b/test/models/network.js
new file mode 100644
index 00000000..04314b3d
--- /dev/null
+++ b/test/models/network.js
@@ -0,0 +1,38 @@
+"use strict";
+
+var expect = require("chai").expect;
+
+var Chan = require("../../src/models/chan");
+var Network = require("../../src/models/network");
+
+describe("Network", function() {
+ describe("#export()", function() {
+
+ it("should produce an valid object", function() {
+ var network = new Network({name: "networkName"});
+ network.setNick("chillin`");
+ network.channels.push(new Chan({name: "#thelounge"}));
+ network.channels.push(new Chan({name: "&foobar"}));
+ network.channels.push(new Chan({name: "Lobby", type: Chan.Type.LOBBY}));
+ network.channels.push(new Chan({name: "PrivateChat", type: Chan.Type.QUERY}));
+
+ expect(network.export()).to.deep.equal({
+ name: "networkName",
+ host: "",
+ port: 6667,
+ tls: false,
+ password: "",
+ username: "",
+ realname: "",
+ commands: [],
+ nick: "chillin`",
+ ip: null,
+ hostname: null,
+ channels: [
+ {"name": "#thelounge"},
+ {"name": "&foobar"},
+ ]
+ });
+ });
+ });
+});
diff --git a/test/models/network.ts b/test/models/network.ts
deleted file mode 100644
index a5a207ac..00000000
--- a/test/models/network.ts
+++ /dev/null
@@ -1,566 +0,0 @@
-import {expect} from "chai";
-import sinon from "ts-sinon";
-import Chan from "../../server/models/chan";
-import {ChanType} from "../../shared/types/chan";
-import Msg from "../../server/models/msg";
-import User from "../../server/models/user";
-import Network from "../../server/models/network";
-import Config from "../../server/config";
-import STSPolicies from "../../server/plugins/sts";
-import ClientCertificate from "../../server/plugins/clientCertificate";
-
-describe("Network", function () {
- let stsPoliciesRefreshStub: sinon.SinonStub;
-
- before(function () {
- stsPoliciesRefreshStub = sinon.stub(STSPolicies, "refresh");
- });
-
- after(function () {
- stsPoliciesRefreshStub.restore();
- });
-
- describe("Network(attr)", function () {
- it("should generate uuid (v4) for each network", function () {
- const network1 = new Network();
- const network2 = new Network();
-
- expect(network1.uuid).to.have.lengthOf(36);
- expect(network2.uuid).to.have.lengthOf(36);
- expect(network1.uuid).to.not.equal(network2.uuid);
- });
-
- it("should keep the lobby at the top", function () {
- const network = new Network({
- name: "Super Nice Network",
- channels: [
- new Chan({name: "AAAA!", type: ChanType.QUERY}),
- new Chan({name: "#thelounge"}),
- new Chan({name: "&foobar"}),
- ],
- });
- network.channels.push(new Chan({name: "#swag"}));
-
- expect(network.channels[0].name).to.equal("Super Nice Network");
- expect(network.channels[0].type).to.equal(ChanType.LOBBY);
- });
-
- it("should maintain channel reference", function () {
- const chan = new Chan({
- name: "#506-bug-fix",
- messages: [
- new Msg({
- text: "message in constructor",
- }),
- ],
- });
-
- const network = new Network({
- name: "networkName",
- channels: [chan],
- });
-
- chan.messages.push(
- new Msg({
- text: "message in original instance",
- })
- );
-
- network.channels[1].messages.push(
- new Msg({
- text: "message after network creation",
- })
- );
-
- expect(network.channels[1].messages).to.have.lengthOf(3);
- expect(network.channels[1].messages[0].text).to.equal("message in constructor");
- expect(network.channels[1].messages[1].text).to.equal("message in original instance");
- expect(network.channels[1].messages[2].text).to.equal("message after network creation");
- });
- });
-
- describe("#export()", function () {
- it("should produce an valid object", function () {
- const network = new Network({
- uuid: "hello world",
- awayMessage: "I am away",
- name: "networkName",
- sasl: "plain",
- saslAccount: "testaccount",
- saslPassword: "testpassword",
- channels: [
- new Chan({name: "#thelounge", key: "", muted: false}),
- new Chan({name: "&foobar", key: "", muted: false}),
- new Chan({name: "#secret", key: "foo", muted: false}),
- new Chan({name: "&secure", key: "bar", muted: true}),
- new Chan({name: "Channel List", type: ChanType.SPECIAL}),
- new Chan({name: "PrivateChat", type: ChanType.QUERY, muted: true}),
- ],
- });
- network.setNick("chillin`");
-
- expect(network.export()).to.deep.equal({
- uuid: "hello world",
- awayMessage: "I am away",
- name: "networkName",
- host: "",
- port: 6667,
- tls: false,
- userDisconnected: false,
- rejectUnauthorized: false,
- password: "",
- username: "",
- realname: "",
- leaveMessage: "",
- sasl: "plain",
- saslAccount: "testaccount",
- saslPassword: "testpassword",
- commands: [],
- nick: "chillin`",
- proxyEnabled: false,
- proxyHost: "",
- proxyPort: 1080,
- proxyPassword: "",
- proxyUsername: "",
- channels: [
- {name: "#thelounge", key: "", muted: false},
- {name: "&foobar", key: "", muted: false},
- {name: "#secret", key: "foo", muted: false},
- {name: "&secure", key: "bar", muted: true},
- {name: "PrivateChat", type: "query", muted: true},
- ],
- ignoreList: [],
- });
- });
- });
-
- describe("#validate()", function () {
- it("should set correct defaults", function () {
- Config.values.defaults.nick = "";
-
- const network = new Network({
- host: "localhost",
- });
-
- expect(network.validate({} as any)).to.be.true;
- expect(network.nick).to.equal("thelounge");
- expect(network.username).to.equal("thelounge");
- expect(network.realname).to.equal("thelounge");
- expect(network.port).to.equal(6667);
-
- const network2 = new Network({
- host: "localhost",
- nick: "@Invalid Nick?",
- });
- expect(network2.validate({} as any)).to.be.true;
- expect(network2.username).to.equal("InvalidNick");
- });
-
- it("should enforce lockNetwork", function () {
- Config.values.lockNetwork = true;
-
- // Make sure we lock in private mode
- Config.values.public = false;
-
- const network = new Network({
- host: "",
- port: 1337,
- tls: false,
- rejectUnauthorized: false,
- });
- expect(network.validate({} as any)).to.be.true;
- expect(network.host).to.equal("irc.example.com");
- expect(network.port).to.equal(6697);
- expect(network.tls).to.be.true;
- expect(network.rejectUnauthorized).to.be.true;
-
- // Make sure we lock in public mode (also resets public=true for other tests)
- Config.values.public = true;
-
- const network2 = new Network({
- host: "some.fake.tld",
- });
- expect(network2.validate({} as any)).to.be.true;
- expect(network2.host).to.equal("irc.example.com");
-
- Config.values.lockNetwork = false;
- });
-
- it("realname should be set to nick only if realname is empty", function () {
- const network = new Network({
- host: "localhost",
- nick: "dummy",
- });
-
- expect(network.validate({} as any)).to.be.true;
- expect(network.nick).to.equal("dummy");
- expect(network.realname).to.equal("dummy");
-
- const network2 = new Network({
- host: "localhost",
- nick: "dummy",
- realname: "notdummy",
- });
-
- expect(network2.validate({} as any)).to.be.true;
- expect(network2.nick).to.equal("dummy");
- expect(network2.realname).to.equal("notdummy");
- });
-
- it("should apply STS policies iff they match", function () {
- const client = {idMsg: 1, emit() {}} as any;
- STSPolicies.update("irc.example.com", 7000, 3600);
- expect(STSPolicies.get("irc.example.com")).to.not.be.null;
-
- let network = new Network({
- host: "irc.example.com",
- port: 1337,
- tls: false,
- });
-
- expect(network.validate(client)).to.be.true;
- expect(network.port).to.equal(7000);
- expect(network.tls).to.be.true;
-
- network = new Network({
- host: "irc2.example.com",
- port: 1337,
- tls: false,
- });
-
- expect(network.validate(client)).to.be.true;
- expect(network.port).to.equal(1337);
- expect(network.tls).to.be.false;
-
- STSPolicies.update("irc.example.com", 7000, 0); // Cleanup
- expect(STSPolicies.get("irc.example.com")).to.be.null;
- });
-
- it("should not remove client certs if TLS is disabled", function () {
- Config.values.public = false;
-
- const client = {idMsg: 1, emit() {}, messageStorage: []};
-
- const network = new Network({host: "irc.example.com", sasl: "external"});
- (network as any).createIrcFramework(client);
- expect(network.irc).to.not.be.null;
-
- const client_cert = network.irc?.options?.client_certificate;
- expect(client_cert).to.not.be.null;
- expect(ClientCertificate.get(network.uuid)).to.deep.equal(client_cert);
-
- expect(network.validate(client as any)).to.be.true;
-
- expect(ClientCertificate.get(network.uuid)).to.deep.equal(client_cert); // Should be unchanged
-
- ClientCertificate.remove(network.uuid);
- Config.values.public = true;
- });
-
- it("should not remove client certs if there is a STS policy", function () {
- Config.values.public = false;
-
- const client = {idMsg: 1, emit() {}, messageStorage: []};
- STSPolicies.update("irc.example.com", 7000, 3600);
- expect(STSPolicies.get("irc.example.com")).to.not.be.null;
-
- const network = new Network({host: "irc.example.com", sasl: "external"});
- (network as any).createIrcFramework(client);
- expect(network.irc).to.not.be.null;
-
- const client_cert = network.irc?.options?.client_certificate;
- expect(client_cert).to.not.be.null;
- expect(ClientCertificate.get(network.uuid)).to.deep.equal(client_cert);
-
- expect(network.validate(client as any)).to.be.true;
-
- expect(ClientCertificate.get(network.uuid)).to.deep.equal(client_cert); // Should be unchanged
-
- ClientCertificate.remove(network.uuid);
- Config.values.public = true;
-
- STSPolicies.update("irc.example.com", 7000, 0); // Cleanup
- expect(STSPolicies.get("irc.example.com")).to.be.null;
- });
- });
-
- describe("#createIrcFramework(client)", function () {
- it("should generate and use a client certificate when using SASL external", function () {
- Config.values.public = false;
-
- const client = {idMsg: 1, emit() {}};
- STSPolicies.update("irc.example.com", 7000, 3600);
- expect(STSPolicies.get("irc.example.com")).to.not.be.null;
-
- let network: any = new Network({host: "irc.example.com"});
- network.createIrcFramework(client);
- expect(network.irc).to.not.be.null;
- expect(network.irc.options.client_certificate).to.be.null;
-
- network = new Network({host: "irc.example.com", sasl: "external"});
- network.createIrcFramework(client);
- expect(network.irc).to.not.be.null;
- expect(network.irc.options.client_certificate).to.not.be.null;
-
- ClientCertificate.remove(network.uuid);
- Config.values.public = true;
-
- STSPolicies.update("irc.example.com", 7000, 0); // Cleanup
- expect(STSPolicies.get("irc.example.com")).to.be.null;
- });
- });
-
- describe("#edit(client, args)", function () {
- it("should enforce correct types", function () {
- let saveCalled = false;
- let nameEmitCalled = false;
-
- const network = new Network();
- (network as any).edit(
- {
- emit(name, data) {
- if (name === "network:name") {
- nameEmitCalled = true;
- expect(data.uuid).to.equal(network.uuid);
- expect(data.name).to.equal("Lounge Test Network");
- }
- },
- save() {
- saveCalled = true;
- },
- },
- {
- nick: "newNick",
- host: "new.tld",
- name: "Lounge Test Network",
- port: "1337",
- tls: undefined,
- rejectUnauthorized: undefined,
- username: 1234,
- password: 4567,
- realname: 8901,
- sasl: "something",
- saslAccount: 1337,
- saslPassword: 1337,
- commands: "/command 1 2 3\r\n/ping HELLO\r\r\r\r/whois test\r\n\r\n",
- ip: "newIp",
- hostname: "newHostname",
- uuid: "newuuid",
- }
- );
-
- expect(saveCalled).to.be.true;
- expect(nameEmitCalled).to.be.true;
- expect(network.uuid).to.not.equal("newuuid");
-
- // @ts-expect-error Property 'ip' does not exist on type 'Network'.
- expect(network.ip).to.be.undefined;
- // @ts-expect-error Property 'hostname' does not exist on type 'Network'.
- expect(network.hostname).to.be.undefined;
-
- expect(network.name).to.equal("Lounge Test Network");
- expect(network.channels[0].name).to.equal("Lounge Test Network");
-
- expect(network.nick).to.equal("newNick");
- expect(network.host).to.equal("new.tld");
- expect(network.port).to.equal(1337);
- expect(network.tls).to.be.false;
- expect(network.rejectUnauthorized).to.be.false;
- expect(network.username).to.equal("1234");
- expect(network.password).to.equal("4567");
- expect(network.realname).to.equal("8901");
- expect(network.sasl).to.equal("");
- expect(network.saslAccount).to.equal("1337");
- expect(network.saslPassword).to.equal("1337");
- expect(network.commands).to.deep.equal([
- "/command 1 2 3",
- "/ping HELLO",
- "/whois test",
- ]);
- });
- });
-
- describe("#getFilteredClone(lastActiveChannel, lastMessage)", function () {
- it("should filter channels", function () {
- const chan = new Chan();
- chan.setUser(new User({nick: "test"}));
-
- const network = new Network({
- channels: [chan],
- });
-
- expect(network.channels[0].users).to.be.empty;
- });
-
- it("should keep necessary properties", function () {
- const network = new Network();
- const clone = network.getFilteredClone();
-
- expect(clone)
- .to.be.an("object")
- .that.has.all.keys("channels", "status", "nick", "name", "serverOptions", "uuid");
-
- expect(clone.status).to.be.an("object").that.has.all.keys("connected", "secure");
- });
- });
-
- describe("#addChannel(newChan)", function () {
- it("should add channel", function () {
- const chan = new Chan({name: "#thelounge"});
-
- const network = new Network({
- channels: [chan],
- });
- // Lobby and initial channel
- expect(network.channels.length).to.equal(2);
-
- const newChan = new Chan({name: "#foo"});
- network.addChannel(newChan);
-
- expect(network.channels.length).to.equal(3);
- });
-
- it("should add channel alphabetically", function () {
- const chan1 = new Chan({name: "#abc"});
- const chan2 = new Chan({name: "#thelounge"});
- const chan3 = new Chan({name: "#zero"});
-
- const network = new Network({
- channels: [chan1, chan2, chan3],
- name: "foo",
- });
-
- const newChan = new Chan({name: "#foo"});
- network.addChannel(newChan);
-
- expect(network.channels[0].name).to.equal("foo");
- expect(network.channels[1]).to.equal(chan1);
- expect(network.channels[2]).to.equal(newChan);
- expect(network.channels[3]).to.equal(chan2);
- expect(network.channels[4]).to.equal(chan3);
- });
-
- it("should sort case-insensitively", function () {
- const chan1 = new Chan({name: "#abc"});
- const chan2 = new Chan({name: "#THELOUNGE"});
-
- const network = new Network({
- channels: [chan1, chan2],
- });
-
- const newChan = new Chan({name: "#foo"});
- network.addChannel(newChan);
-
- expect(network.channels[1]).to.equal(chan1);
- expect(network.channels[2]).to.equal(newChan);
- expect(network.channels[3]).to.equal(chan2);
- });
-
- it("should sort users separately from channels", function () {
- const chan1 = new Chan({name: "#abc"});
- const chan2 = new Chan({name: "#THELOUNGE"});
-
- const network = new Network({
- channels: [chan1, chan2],
- });
-
- const newUser = new Chan({name: "mcinkay", type: ChanType.QUERY});
- network.addChannel(newUser);
-
- expect(network.channels[1]).to.equal(chan1);
- expect(network.channels[2]).to.equal(chan2);
- expect(network.channels[3]).to.equal(newUser);
- });
-
- it("should sort users alphabetically", function () {
- const chan1 = new Chan({name: "#abc"});
- const chan2 = new Chan({name: "#THELOUNGE"});
- const user1 = new Chan({name: "astorije", type: ChanType.QUERY});
- const user2 = new Chan({name: "xpaw", type: ChanType.QUERY});
-
- const network = new Network({
- channels: [chan1, chan2, user1, user2],
- });
-
- const newUser = new Chan({name: "mcinkay", type: ChanType.QUERY});
- network.addChannel(newUser);
-
- expect(network.channels[1]).to.equal(chan1);
- expect(network.channels[2]).to.equal(chan2);
- expect(network.channels[3]).to.equal(user1);
- expect(network.channels[4]).to.equal(newUser);
- expect(network.channels[5]).to.equal(user2);
- });
-
- it("should not sort special channels", function () {
- const chan1 = new Chan({name: "#abc"});
- const chan2 = new Chan({name: "#THELOUNGE"});
- const user1 = new Chan({name: "astorije", type: ChanType.QUERY});
- const user2 = new Chan({name: "xpaw", type: ChanType.QUERY});
-
- const network = new Network({
- channels: [chan1, chan2, user1, user2],
- });
-
- const newBanlist = new Chan({name: "Banlist for #THELOUNGE", type: ChanType.SPECIAL});
- network.addChannel(newBanlist);
-
- expect(network.channels[1]).to.equal(chan1);
- expect(network.channels[2]).to.equal(chan2);
- expect(network.channels[3]).to.equal(user1);
- expect(network.channels[4]).to.equal(user2);
- expect(network.channels[5]).to.equal(newBanlist);
- });
-
- it("should not compare against special channels", function () {
- const chan1 = new Chan({name: "#abc"});
- const chan2 = new Chan({name: "#THELOUNGE"});
- const user1 = new Chan({name: "astorije", type: ChanType.QUERY});
-
- const network = new Network({
- channels: [chan1, chan2, user1],
- });
-
- const newBanlist = new Chan({name: "Banlist for #THELOUNGE", type: ChanType.SPECIAL});
- network.addChannel(newBanlist);
- const newUser = new Chan({name: "mcinkay", type: ChanType.QUERY});
- network.addChannel(newUser);
-
- expect(network.channels[1]).to.equal(chan1);
- expect(network.channels[2]).to.equal(chan2);
- expect(network.channels[3]).to.equal(user1);
- expect(network.channels[4]).to.equal(newUser);
- expect(network.channels[5]).to.equal(newBanlist);
- });
-
- it("should insert before first special channel", function () {
- const banlist = new Chan({name: "Banlist for #THELOUNGE", type: ChanType.SPECIAL});
- const chan1 = new Chan({name: "#thelounge"});
- const user1 = new Chan({name: "astorije", type: ChanType.QUERY});
-
- const network = new Network({
- channels: [banlist, chan1, user1],
- });
-
- const newChan = new Chan({name: "#foo"});
- network.addChannel(newChan);
-
- expect(network.channels[1]).to.equal(newChan);
- expect(network.channels[2]).to.equal(banlist);
- expect(network.channels[3]).to.equal(chan1);
- expect(network.channels[4]).to.equal(user1);
- });
-
- it("should never add something in front of the lobby", function () {
- const network = new Network({
- name: "foo",
- channels: [],
- });
-
- const newUser = new Chan({name: "astorije"});
- network.addChannel(newUser);
-
- expect(network.channels[1]).to.equal(newUser);
- });
- });
-});
diff --git a/test/plugins/auth/ldap.ts b/test/plugins/auth/ldap.ts
deleted file mode 100644
index 74a606df..00000000
--- a/test/plugins/auth/ldap.ts
+++ /dev/null
@@ -1,184 +0,0 @@
-import log from "../../../server/log";
-import ldapAuth from "../../../server/plugins/auth/ldap";
-import Config from "../../../server/config";
-import ldap from "ldapjs";
-import {expect} from "chai";
-import TestUtil from "../../util";
-import ClientManager from "../../../server/clientManager";
-import sinon from "ts-sinon";
-
-const user = "johndoe";
-const wrongUser = "eve";
-const correctPassword = "loremipsum";
-const wrongPassword = "dolorsitamet";
-const baseDN = "ou=accounts,dc=example,dc=com";
-const primaryKey = "uid";
-const serverPort = 1389;
-
-function normalizeDN(dn: string) {
- // warning is bogus in this case
- // eslint-disable-next-line @typescript-eslint/no-base-to-string
- return ldap.parseDN(dn).toString();
-}
-
-function startLdapServer(callback) {
- const server = ldap.createServer();
-
- const searchConf = Config.values.ldap.searchDN;
- const userDN = primaryKey + "=" + user + "," + baseDN;
-
- // Two users are authorized: john doe and the root user in case of
- // advanced auth (the user that does the search for john's actual
- // bindDN)
- const authorizedUsers = {};
- authorizedUsers[normalizeDN(searchConf.rootDN)] = searchConf.rootPassword;
- authorizedUsers[normalizeDN(userDN)] = correctPassword;
-
- function authorize(req: any, res: any, next: (error?: any) => void) {
- const bindDN = req.connection.ldap.bindDN;
-
- if (bindDN in authorizedUsers) {
- return next();
- }
-
- return next(new ldap.InsufficientAccessRightsError());
- }
-
- Object.keys(authorizedUsers).forEach(function (dn) {
- server.bind(dn, function (req, res, next: (error?: any) => void) {
- const bindDN = req.dn.toString();
- const password = req.credentials;
-
- if (bindDN in authorizedUsers && authorizedUsers[bindDN] === password) {
- req.connection.ldap.bindDN = req.dn;
- res.end();
- return next();
- }
-
- return next(new ldap.InsufficientAccessRightsError());
- });
- });
-
- server.search(searchConf.base, authorize, function (req, res) {
- const obj = {
- dn: userDN,
- attributes: {
- objectclass: ["person", "top"],
- cn: ["john doe"],
- sn: ["johnny"],
- uid: ["johndoe"],
- memberof: [baseDN],
- },
- };
-
- if (req.filter.matches(obj.attributes)) {
- // TODO: check req.scope if ldapjs does not
- res.send(obj);
- }
-
- res.end();
- });
-
- server.listen(serverPort, callback);
-
- return server;
-}
-
-function testLdapAuth() {
- // Create mock manager and client. When client is true, manager should not
- // be used. But ideally the auth plugin should not use any of those.
- const manager = {} as ClientManager;
- const client = true;
-
- it("should successfully authenticate with correct password", function (done) {
- // TODO: why is client = true?
- ldapAuth.auth(manager, client as any, user, correctPassword, function (valid) {
- expect(valid).to.equal(true);
- done();
- });
- });
-
- it("should fail to authenticate with incorrect password", function (done) {
- let error = "";
-
- const errorLogStub = sinon
- .stub(log, "error")
- .callsFake(TestUtil.sanitizeLog((str) => (error += str)));
-
- ldapAuth.auth(manager, client as any, user, wrongPassword, function (valid) {
- expect(valid).to.equal(false);
- expect(error).to.equal(
- "LDAP bind failed: InsufficientAccessRightsError: InsufficientAccessRightsError\n"
- );
- errorLogStub.restore();
- done();
- });
- });
-
- it("should fail to authenticate with incorrect username", function (done) {
- let warning = "";
- const warnLogStub = sinon
- .stub(log, "warn")
- .callsFake(TestUtil.sanitizeLog((str) => (warning += str)));
-
- ldapAuth.auth(manager, client as any, wrongUser, correctPassword, function (valid) {
- expect(valid).to.equal(false);
- expect(warning).to.equal("LDAP Search did not find anything for: eve (0)\n");
- warnLogStub.restore();
- done();
- });
- });
-}
-
-describe("LDAP authentication plugin", function () {
- // Increase timeout due to unpredictable I/O on CI services
- this.timeout(TestUtil.isRunningOnCI() ? 25000 : 5000);
- this.slow(300);
-
- let server: ldap.Server;
- let logInfoStub: sinon.SinonStub;
-
- before(function (done) {
- logInfoStub = sinon.stub(log, "info");
- server = startLdapServer(done);
- });
-
- after(function () {
- server.close(() => {
- // no-op
- });
- logInfoStub.restore();
- });
-
- beforeEach(function () {
- Config.values.public = false;
- Config.values.ldap.enable = true;
- Config.values.ldap.url = "ldap://127.0.0.1:" + String(serverPort);
- Config.values.ldap.primaryKey = primaryKey;
- });
-
- afterEach(function () {
- Config.values.public = true;
- Config.values.ldap.enable = false;
- });
-
- describe("LDAP authentication availability", function () {
- it("checks that the configuration is correctly tied to isEnabled()", function () {
- Config.values.ldap.enable = true;
- expect(ldapAuth.isEnabled()).to.equal(true);
-
- Config.values.ldap.enable = false;
- expect(ldapAuth.isEnabled()).to.equal(false);
- });
- });
-
- describe("Simple LDAP authentication (predefined DN pattern)", function () {
- Config.values.ldap.baseDN = baseDN;
- testLdapAuth();
- });
-
- describe("Advanced LDAP authentication (DN found by a prior search query)", function () {
- delete Config.values.ldap.baseDN;
- testLdapAuth();
- });
-});
diff --git a/test/plugins/clientCertificate.ts b/test/plugins/clientCertificate.ts
deleted file mode 100644
index 2ac359ae..00000000
--- a/test/plugins/clientCertificate.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-import fs from "fs";
-import path from "path";
-import {expect} from "chai";
-import ClientCertificate, {ClientCertificateType} from "../../server/plugins/clientCertificate";
-import Config from "../../server/config";
-
-describe("ClientCertificate", function () {
- it("should not generate a client certificate in public mode", function () {
- Config.values.public = true;
-
- const certificate = ClientCertificate.get("this-is-test-uuid");
- expect(certificate).to.be.null;
- });
-
- it("should generate a client certificate", function () {
- Config.values.public = false;
- const certificate = ClientCertificate.get("this-is-test-uuid") as ClientCertificateType;
-
- expect(certificate.certificate).to.match(/^-----BEGIN CERTIFICATE-----/);
- expect(certificate.private_key).to.match(/^-----BEGIN RSA PRIVATE KEY-----/);
-
- const certificate2 = ClientCertificate.get("this-is-test-uuid") as ClientCertificateType;
- expect(certificate2.certificate).to.equal(certificate.certificate);
- expect(certificate2.private_key).to.equal(certificate.private_key);
-
- Config.values.public = true;
- });
-
- it("should remove the client certificate files", function () {
- Config.values.public = false;
-
- const privateKeyPath = path.join(
- Config.getClientCertificatesPath(),
- `this-is-test-uuid.pem`
- );
- const certificatePath = path.join(
- Config.getClientCertificatesPath(),
- `this-is-test-uuid.crt`
- );
-
- expect(fs.existsSync(privateKeyPath)).to.be.true;
- expect(fs.existsSync(certificatePath)).to.be.true;
-
- ClientCertificate.remove("this-is-test-uuid");
-
- expect(fs.existsSync(privateKeyPath)).to.be.false;
- expect(fs.existsSync(certificatePath)).to.be.false;
-
- Config.values.public = true;
- });
-});
diff --git a/test/plugins/inputs/indexTest.ts b/test/plugins/inputs/indexTest.ts
deleted file mode 100644
index 2cae7c7d..00000000
--- a/test/plugins/inputs/indexTest.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import {expect} from "chai";
-import inputs from "../../../server/plugins/inputs";
-
-describe("inputs", function () {
- describe(".getCommands", function () {
- it("should return a non-empty array", function () {
- expect(inputs.getCommands()).to.be.an("array").that.is.not.empty;
- });
-
- it("should only return strings with no whitespaces and starting with /", function () {
- inputs.getCommands().forEach((command) => {
- expect(command).to.be.a("string").that.does.not.match(/\s/);
- expect(command[0]).to.equal("/");
- });
- });
- });
-});
diff --git a/test/plugins/link.js b/test/plugins/link.js
new file mode 100644
index 00000000..278a2713
--- /dev/null
+++ b/test/plugins/link.js
@@ -0,0 +1,37 @@
+var assert = require("assert");
+
+var util = require("../util");
+var link = require("../../src/plugins/irc-events/link.js");
+
+describe("Link plugin", function() {
+ before(function(done) {
+ this.app = util.createWebserver();
+ this.connection = this.app.listen(9002, done);
+ });
+
+ after(function(done) {
+ this.connection.close(done);
+ });
+
+ beforeEach(function() {
+ this.irc = util.createClient();
+ this.network = util.createNetwork();
+ });
+
+ it("should be able to fetch basic information about URLs", function(done) {
+ link.call(this.irc, this.irc, this.network);
+
+ this.app.get("/basic", function(req, res) {
+ res.send("test ");
+ });
+
+ this.irc.createMessage({
+ message: "http://localhost:9002/basic"
+ });
+
+ this.irc.once("toggle", function(data) {
+ assert.equal(data.head, "test");
+ done();
+ });
+ });
+});
diff --git a/test/plugins/link.ts b/test/plugins/link.ts
deleted file mode 100644
index 0d016512..00000000
--- a/test/plugins/link.ts
+++ /dev/null
@@ -1,722 +0,0 @@
-import path from "path";
-import {expect} from "chai";
-import util from "../util";
-import Config from "../../server/config";
-import link from "../../server/plugins/irc-events/link";
-import {LinkPreview} from "../../shared/types/msg";
-
-describe("Link plugin", function () {
- // Increase timeout due to unpredictable I/O on CI services
- this.timeout(util.isRunningOnCI() ? 25000 : 5000);
- this.slow(300);
-
- const loremIpsum = `Lorem ipsum dolor sit amet, consectetur adipiscing elit.\
-Vivamus at pretium mauris. Aenean eu orci id erat pulvinar\
-commodo cursus ac augue. Ut dui quam, tempus ac felis et,\
-efficitur auctor nisl. Sed semper sit amet metus eu fringilla.\
-Vivamus vitae ligula quis eros rutrum tristique. Suspendisse\
-luctus molestie tortor, in finibus nulla rutrum quis. Proin\
-congue ut elit eget congue. Nam pretium blandit nibh nec laoreet.\
-Suspendisse vehicula turpis urna, sit amet molestie diam dapibus in.\
-Vivamus bibendum vulputate tincidunt. Sed vitae ligula felis.`;
-
- let app;
-
- beforeEach(function (done) {
- app = util.createWebserver();
- app.get("/real-test-image.png", function (req, res) {
- res.sendFile(path.resolve(__dirname, "../../client/img/logo-grey-bg-120x120px.png"));
- });
- this.connection = app.listen(0, "127.0.0.1", () => {
- this.port = this.connection.address().port;
- this.host = this.connection.address().address;
- done();
- });
-
- this._makeUrl = (_path: string): string => `http://${this.host}:${this.port}/${_path}`;
-
- this.irc = util.createClient();
- this.network = util.createNetwork();
-
- Config.values.prefetchStorage = false;
- });
-
- afterEach(function (done) {
- this.connection.close(done);
- });
-
- it("should be able to fetch basic information about URLs", function (done) {
- const url = this._makeUrl("basic");
- const message = this.irc.createMessage({
- text: url,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- expect(message.previews).to.deep.equal([
- {
- body: "",
- head: "",
- link: url,
- thumb: "",
- size: -1,
- type: "loading",
- shown: null,
- },
- ]);
-
- app.get("/basic", function (req, res) {
- res.send(
- "test title "
- );
- });
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.type).to.equal("link");
- expect(data.preview.head).to.equal("test title");
- expect(data.preview.body).to.equal("simple description");
- expect(data.preview.link).to.equal(url);
-
- expect(message.previews).to.deep.equal([data.preview]);
- done();
- });
- });
-
- it("should be able to display body for text/plain", function (done) {
- const url = this._makeUrl("basic-text");
- const message = this.irc.createMessage({
- text: url,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- expect(message.previews).to.deep.equal([
- {
- body: "",
- head: "",
- link: url,
- thumb: "",
- size: -1,
- type: "loading",
- shown: null,
- },
- ]);
-
- app.get("/basic-text", function (req, res) {
- res.type("text").send(loremIpsum);
- });
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.type).to.equal("link");
- expect(data.preview.head).to.equal("Untitled page");
- expect(data.preview.body).to.equal(loremIpsum.substring(0, 300));
- expect(data.preview.body).to.have.length(300);
- expect(data.preview.link).to.equal(url);
-
- expect(message.previews).to.deep.equal([data.preview]);
- done();
- });
- });
-
- it("should truncate head and body", function (done) {
- const url = this._makeUrl("truncate");
- const message = this.irc.createMessage({
- text: url,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- app.get("/truncate", function (req, res) {
- res.send(
- `${loremIpsum} `
- );
- });
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.type).to.equal("link");
- expect(data.preview.head).to.equal(loremIpsum.substring(0, 100));
- expect(data.preview.body).to.equal(loremIpsum.substring(0, 300));
- expect(data.preview.link).to.equal(url);
-
- expect(message.previews).to.deep.equal([data.preview]);
- done();
- });
- });
-
- it("should prefer og:title over title", function (done) {
- const message = this.irc.createMessage({
- text: this._makeUrl("basic-og"),
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- app.get("/basic-og", function (req, res) {
- res.send("test ");
- });
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.head).to.equal("opengraph test");
- done();
- });
- });
-
- it("should find only the first matching tag", function (done) {
- const message = this.irc.createMessage({
- text: this._makeUrl("duplicate-tags"),
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- app.get("/duplicate-tags", function (req, res) {
- res.send(
- "test magnifying glass icon "
- );
- });
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.head).to.equal("test");
- expect(data.preview.body).to.equal("desc1");
- done();
- });
- });
-
- it("should prefer og:description over description", function (done) {
- const message = this.irc.createMessage({
- text: this._makeUrl("description-og"),
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- app.get("/description-og", function (req, res) {
- res.send(
- " "
- );
- });
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.body).to.equal("opengraph description");
- done();
- });
- });
-
- it("should find og:image with full url", function (done) {
- const message = this.irc.createMessage({
- text: this._makeUrl("thumb"),
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- const url = this._makeUrl("real-test-image.png");
- app.get("/thumb", function (req, res) {
- res.send(`Google `);
- });
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.head).to.equal("Google");
- expect(data.preview.thumb).to.equal(url);
- done();
- });
- });
-
- describe("test disableMediaPreview", function () {
- beforeEach(function (done) {
- Config.values.disableMediaPreview = true;
- done();
- });
- afterEach(function (done) {
- Config.values.disableMediaPreview = false;
- done();
- });
- it("should ignore og:image if disableMediaPreview", function (done) {
- app.get("/nonexistent-test-image.png", function () {
- throw "Should not fetch image";
- });
-
- const invalid_url = this._makeUrl("nonexistent-test-image.png");
- app.get("/thumb", function (req, res) {
- res.send(`Google `
- );
- });
- const message = this.irc.createMessage({
- text: this._makeUrl("thumb"),
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.head).to.equal("Google");
- expect(data.preview.type).to.equal("link");
- done();
- });
- });
- });
-
- it("should find image_src", function (done) {
- const message = this.irc.createMessage({
- text: this._makeUrl("thumb-image-src"),
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- const url = this._makeUrl("real-test-image.png");
- app.get("/thumb-image-src", function (req, res) {
- res.send(` `);
- });
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.thumb).to.equal(url);
- done();
- });
- });
-
- it("should correctly resolve relative protocol", function (done) {
- const message = this.irc.createMessage({
- text: this._makeUrl("thumb-image-src"),
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- const real_image_url = this._makeUrl("real-test-image.png");
- app.get("/thumb-image-src", function (req, res) {
- res.send(` `);
- });
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.thumb).to.equal(real_image_url);
- done();
- });
- });
-
- it("should resolve url correctly for relative url", function (done) {
- const relative_thumb_url = this._makeUrl("relative-thumb");
- const message = this.irc.createMessage({
- text: relative_thumb_url,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- app.get("/relative-thumb", function (req, res) {
- res.send(
- "test relative image "
- );
- });
- const real_image_url = this._makeUrl("real-test-image.png");
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.thumb).to.equal(real_image_url);
- expect(data.preview.head).to.equal("test relative image");
- expect(data.preview.link).to.equal(relative_thumb_url);
- done();
- });
- });
-
- it("should send untitled page if there is a thumbnail", function (done) {
- const real_image_url = this._makeUrl("real-test-image.png");
- const thumb_no_title_url = this._makeUrl("thumb-no-title");
- const message = this.irc.createMessage({
- text: thumb_no_title_url,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- app.get("/thumb-no-title", function (req, res) {
- res.send(` `);
- });
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.head).to.equal("Untitled page");
- expect(data.preview.thumb).to.equal(real_image_url);
- expect(data.preview.link).to.equal(thumb_no_title_url);
- done();
- });
- });
-
- it("should send untitled page if there is body", function (done) {
- const body_no_title_url = this._makeUrl("body-no-title");
- const message = this.irc.createMessage({
- text: body_no_title_url,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- app.get("/body-no-title", function (req, res) {
- res.send(" ");
- });
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.head).to.equal("Untitled page");
- expect(data.preview.body).to.equal("hello world");
- expect(data.preview.thumb).to.equal("");
- expect(data.preview.link).to.equal(body_no_title_url);
- done();
- });
- });
-
- it("should not send thumbnail if image is 404", function (done) {
- const thumb_404_url = this._makeUrl("thumb-404");
- const message = this.irc.createMessage({
- text: thumb_404_url,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- const invalid_url = this._makeUrl("this-image-does-not-exist.png");
- app.get("/thumb-404", function (req, res) {
- res.send(`404 image 404 image `);
- });
-
- app.get("/image-url.png", function (req, res) {
- expect(req.headers.accept).to.equal("*/*");
- res.send();
- done();
- });
-
- const message = this.irc.createMessage({
- text: msg_url,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
- });
-
- it("should not add slash to url", function (done) {
- const url = this._makeUrl("").slice(0, -1); // trim the trailing slash for testing
- const message = this.irc.createMessage({
- text: url,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.link).to.equal(url);
- done();
- });
- });
-
- it("should work on non-ASCII urls", function (done) {
- const links = [
- "unicode/ıoı-test",
- "unicode/русский-текст-test",
- "unicode/🙈-emoji-test",
- "unicodeq/?q=ıoı-test",
- "unicodeq/?q=русский-текст-test",
- "unicodeq/?q=🙈-emoji-test",
- ].map((p) => this._makeUrl(p) as string);
- const message = this.irc.createMessage({
- text: links.join(" "),
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- app.get("/unicode/:q", function (req, res) {
- res.send(`${req.params.q} `);
- });
-
- app.get("/unicodeq/", function (req, res) {
- res.send(`${req.query.q} `);
- });
-
- const previews: LinkPreview[] = [];
-
- this.irc.on("msg:preview", function (data) {
- previews.push(data.preview.link);
-
- if (data.preview.link.includes("ıoı-test")) {
- expect(data.preview.head).to.equal("ıoı-test");
- } else if (data.preview.link.includes("русский-текст-test")) {
- expect(data.preview.head).to.equal("русский-текст-test");
- } else if (data.preview.link.includes("🙈-emoji-test")) {
- expect(data.preview.head).to.equal("🙈-emoji-test");
- } else {
- expect("This should never happen").to.equal(data.preview.link);
- }
-
- if (previews.length === 5) {
- expect(
- message.previews.map((preview) => preview.link as LinkPreview)
- ).to.have.members(previews);
- done();
- }
- });
- });
-
- it("should not fetch links without a schema", function () {
- const port = this.port;
- const host = this.host;
- const message = this.irc.createMessage({
- text: `//${host}:${port} ${host}:${port} //${host}:${port}/test ${host}:${port}/test`,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- expect(message.previews).to.be.empty;
- });
-
- it("should de-duplicate links", function (done) {
- const port = this.port;
- const host = this.host;
- const message = this.irc.createMessage({
- text: `//${host}:${port}/ http://${host}:${port}/ http://${host}:${port}/`,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- const root_url = this._makeUrl("");
- expect(message.previews).to.deep.equal([
- {
- type: "loading",
- head: "",
- body: "",
- thumb: "",
- size: -1,
- link: root_url,
- shown: null,
- },
- ]);
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.link).to.equal(root_url);
- expect(data.preview.type).to.equal("error");
- done();
- });
- });
-
- it("should not try to fetch links with wrong protocol", function () {
- const message = this.irc.createMessage({
- text: "ssh://example.com ftp://example.com irc://example.com http:////////example.com",
- });
-
- expect(message.previews).to.be.empty;
- });
-
- it("should not try to fetch links with username or password", function () {
- const message = this.irc.createMessage({
- text: "http://root:'some%pass'@hostname/database http://a:%p@c http://a:%p@example.com http://test@example.com",
- });
-
- expect(message.previews).to.be.empty;
- });
-
- it("should fetch same link only once at the same time", function (done) {
- const message = this.irc.createMessage({
- text: this._makeUrl("basic-og-once"),
- });
-
- let requests = 0;
- let responses = 0;
-
- this.irc.config.browser.language = "very nice language";
-
- link(this.irc, this.network.channels[0], message, message.text);
- link(this.irc, this.network.channels[0], message, message.text);
- process.nextTick(() => link(this.irc, this.network.channels[0], message, message.text));
-
- app.get("/basic-og-once", function (req, res) {
- requests++;
-
- expect(req.header("accept-language")).to.equal("very nice language");
-
- // delay the request so it doesn't resolve immediately
- setTimeout(() => {
- res.send("test prefetch ");
- }, 100);
- });
-
- const cb = (data) => {
- responses++;
-
- expect(data.preview.head, "test prefetch");
-
- if (responses === 3) {
- this.irc.removeListener("msg:preview", cb);
- expect(requests).to.equal(1);
- done();
- }
- };
-
- this.irc.on("msg:preview", cb);
- });
-
- it("should fetch same link with different languages multiple times", function (done) {
- const message = this.irc.createMessage({
- text: this._makeUrl("basic-og-once-lang"),
- });
-
- const requests: string[] = [];
- let responses = 0;
-
- this.irc.config.browser.language = "first language";
- link(this.irc, this.network.channels[0], message, message.text);
-
- setTimeout(() => {
- this.irc.config.browser.language = "second language";
- link(this.irc, this.network.channels[0], message, message.text);
- }, 100);
-
- app.get("/basic-og-once-lang", function (req, res) {
- requests.push(req.header("accept-language"));
-
- // delay the request so it doesn't resolve immediately
- setTimeout(() => {
- res.send("test prefetch ");
- }, 100);
- });
-
- const cb = (data) => {
- responses++;
-
- expect(data.preview.head, "test prefetch");
-
- if (responses === 2) {
- this.irc.removeListener("msg:preview", cb);
- expect(requests).to.deep.equal(["first language", "second language"]);
- done();
- }
- };
-
- this.irc.on("msg:preview", cb);
- });
-});
diff --git a/test/plugins/packages/indexTest.ts b/test/plugins/packages/indexTest.ts
deleted file mode 100644
index ca4c0d13..00000000
--- a/test/plugins/packages/indexTest.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import log from "../../../server/log";
-import {expect} from "chai";
-import TestUtil from "../../util";
-import sinon from "ts-sinon";
-import packagePlugin from "../../../server/plugins/packages";
-
-let packages: typeof packagePlugin;
-
-describe("packages", function () {
- let logInfoStub: sinon.SinonStub;
-
- beforeEach(function () {
- logInfoStub = sinon.stub(log, "info");
-
- delete require.cache[require.resolve("../../../server/plugins/packages")];
- // eslint-disable-next-line @typescript-eslint/no-var-requires
- packages = require("../../../server/plugins/packages").default;
- });
-
- afterEach(function () {
- logInfoStub.restore();
- });
-
- describe(".getStylesheets", function () {
- it("should contain no stylesheets before packages are loaded", function () {
- expect(packages.getStylesheets()).to.be.empty;
- });
-
- it("should return the list of registered stylesheets for loaded packages", function () {
- packages.loadPackages();
-
- expect(packages.getStylesheets()).to.deep.equal(["thelounge-package-foo/style.css"]);
- });
- });
-
- describe(".getPackage", function () {
- it("should contain no reference to packages before loading them", function () {
- expect(packages.getPackage("thelounge-package-foo")).to.be.undefined;
- });
-
- it("should return details of a registered package after it was loaded", function () {
- packages.loadPackages();
-
- expect(packages.getPackage("thelounge-package-foo")).to.have.key("onServerStart");
- });
- });
-
- describe(".loadPackages", function () {
- it("should display report about loading packages", function () {
- // Mock `log.info` to extract its effect into a string
- logInfoStub.restore();
- let stdout = "";
- logInfoStub = sinon
- .stub(log, "info")
- .callsFake(TestUtil.sanitizeLog((str) => (stdout += str)));
- packages.loadPackages();
-
- expect(stdout).to.deep.equal(
- "Package thelounge-package-foo vdummy loaded\nThere are packages using the experimental plugin API. Be aware that this API is not yet stable and may change in future The Lounge releases.\n"
- );
- });
- });
-});
diff --git a/test/plugins/sqlite.ts b/test/plugins/sqlite.ts
deleted file mode 100644
index 06d2b199..00000000
--- a/test/plugins/sqlite.ts
+++ /dev/null
@@ -1,488 +0,0 @@
-import fs from "fs";
-import path from "path";
-import {expect} from "chai";
-import util from "../util";
-import Msg from "../../server/models/msg";
-import {MessageType} from "../../shared/types/msg";
-import Config from "../../server/config";
-import MessageStorage, {
- currentSchemaVersion,
- migrations,
- necessaryMigrations,
- rollbacks,
-} from "../../server/plugins/messageStorage/sqlite";
-import sqlite3 from "sqlite3";
-import {DeletionRequest} from "../../server/plugins/messageStorage/types";
-
-const orig_schema = [
- // Schema version #1
- // DO NOT CHANGE THIS IN ANY WAY, it's needed to properly test migrations
- "CREATE TABLE IF NOT EXISTS options (name TEXT, value TEXT, CONSTRAINT name_unique UNIQUE (name))",
- "CREATE TABLE IF NOT EXISTS messages (network TEXT, channel TEXT, time INTEGER, type TEXT, msg TEXT)",
- "CREATE INDEX IF NOT EXISTS network_channel ON messages (network, channel)",
- "CREATE INDEX IF NOT EXISTS time ON messages (time)",
-];
-
-const v1_schema_version = 1520239200;
-
-const v1_dummy_messages = [
- {
- network: "8f650427-79a2-4950-b8af-94088b61b37c",
- channel: "##linux",
- time: 1594845354280,
- type: "message",
- msg: '{"from":{"mode":"","nick":"rascul"},"text":"db on a flash drive doesn\'t sound very nice though","self":false,"highlight":false,"users":[]}',
- },
- {
- network: "8f650427-79a2-4950-b8af-94088b61b37c",
- channel: "##linux",
- time: 1594845357234,
- type: "message",
- msg: '{"from":{"mode":"","nick":"GrandPa-G"},"text":"that\'s the point of changing to make sure.","self":false,"highlight":false,"users":[]}',
- },
- {
- network: "8f650427-79a2-4950-b8af-94088b61b37c",
- channel: "#pleroma-dev",
- time: 1594845358464,
- type: "message",
- msg: '{"from":{"mode":"@","nick":"rinpatch"},"text":"it\'s complicated","self":false,"highlight":false,"users":[]}',
- },
-];
-
-describe("SQLite migrations", function () {
- let db: sqlite3.Database;
-
- function serialize_run(stmt: string, ...params: any[]): Promise {
- return new Promise((resolve, reject) => {
- db.serialize(() => {
- db.run(stmt, params, (err) => {
- if (err) {
- reject(err);
- return;
- }
-
- resolve();
- });
- });
- });
- }
-
- before(async function () {
- db = new sqlite3.Database(":memory:");
-
- for (const stmt of orig_schema) {
- await serialize_run(stmt);
- }
-
- for (const msg of v1_dummy_messages) {
- await serialize_run(
- "INSERT INTO messages(network, channel, time, type, msg) VALUES(?, ?, ?, ?, ?)",
- msg.network,
- msg.channel,
- msg.time,
- msg.type,
- msg.msg
- );
- }
- });
-
- after(function (done) {
- db.close(done);
- });
-
- it("has a down migration for every migration", function () {
- expect(migrations.length).to.eq(rollbacks.length);
- expect(migrations.map((m) => m.version)).to.have.ordered.members(
- rollbacks.map((r) => r.version)
- );
- });
-
- it("has working up-migrations", async function () {
- const to_execute = necessaryMigrations(v1_schema_version);
- expect(to_execute.length).to.eq(migrations.length);
- await serialize_run("BEGIN EXCLUSIVE TRANSACTION");
-
- for (const stmt of to_execute.map((m) => m.stmts).flat()) {
- await serialize_run(stmt);
- }
-
- await serialize_run("COMMIT TRANSACTION");
- });
-
- it("has working down-migrations", async function () {
- await serialize_run("BEGIN EXCLUSIVE TRANSACTION");
-
- for (const rollback of rollbacks.slice().reverse()) {
- if (rollback.rollback_forbidden) {
- throw Error(
- "Try to write a down migration, if you really can't, flip this to a break"
- );
- }
-
- for (const stmt of rollback.stmts) {
- await serialize_run(stmt);
- }
- }
-
- await serialize_run("COMMIT TRANSACTION");
- });
-});
-
-describe("SQLite unit tests", function () {
- let store: MessageStorage;
-
- beforeEach(async function () {
- store = new MessageStorage("testUser");
- await store._enable(":memory:");
- store.initDone.resolve();
- });
-
- afterEach(async function () {
- await store.close();
- });
-
- it("deletes messages when asked to", async function () {
- const baseDate = new Date();
-
- const net = {uuid: "testnet"} as any;
- const chan = {name: "#channel"} as any;
-
- for (let i = 0; i < 14; ++i) {
- await store.index(
- net,
- chan,
- new Msg({
- time: dateAddDays(baseDate, -i),
- text: `msg ${i}`,
- })
- );
- }
-
- const limit = 1;
- const delReq: DeletionRequest = {
- messageTypes: [MessageType.MESSAGE],
- limit: limit,
- olderThanDays: 2,
- };
-
- let deleted = await store.deleteMessages(delReq);
- expect(deleted).to.equal(limit, "number of deleted messages doesn't match");
-
- let id = 0;
- let messages = await store.getMessages(net, chan, () => id++);
- expect(messages.find((m) => m.text === "msg 13")).to.be.undefined; // oldest gets deleted first
-
- // let's test if it properly cleans now
- delReq.limit = 100;
- deleted = await store.deleteMessages(delReq);
- expect(deleted).to.equal(11, "number of deleted messages doesn't match");
- messages = await store.getMessages(net, chan, () => id++);
- expect(messages.map((m) => m.text)).to.have.ordered.members(["msg 1", "msg 0"]);
- });
-
- it("deletes only the types it should", async function () {
- const baseDate = new Date();
-
- const net = {uuid: "testnet"} as any;
- const chan = {name: "#channel"} as any;
-
- for (let i = 0; i < 6; ++i) {
- await store.index(
- net,
- chan,
- new Msg({
- time: dateAddDays(baseDate, -i),
- text: `msg ${i}`,
- type: [
- MessageType.ACTION,
- MessageType.AWAY,
- MessageType.JOIN,
- MessageType.PART,
- MessageType.KICK,
- MessageType.MESSAGE,
- ][i],
- })
- );
- }
-
- const delReq: DeletionRequest = {
- messageTypes: [MessageType.ACTION, MessageType.JOIN, MessageType.KICK],
- limit: 100, // effectively no limit
- olderThanDays: 0,
- };
-
- let deleted = await store.deleteMessages(delReq);
- expect(deleted).to.equal(3, "number of deleted messages doesn't match");
-
- let id = 0;
- let messages = await store.getMessages(net, chan, () => id++);
- expect(messages.map((m) => m.type)).to.have.ordered.members([
- MessageType.MESSAGE,
- MessageType.PART,
- MessageType.AWAY,
- ]);
-
- delReq.messageTypes = [
- MessageType.JOIN, // this is not in the remaining set, just here as a dummy
- MessageType.PART,
- MessageType.MESSAGE,
- ];
- deleted = await store.deleteMessages(delReq);
- expect(deleted).to.equal(2, "number of deleted messages doesn't match");
- messages = await store.getMessages(net, chan, () => id++);
- expect(messages.map((m) => m.type)).to.have.ordered.members([MessageType.AWAY]);
- });
-});
-
-describe("SQLite Message Storage", function () {
- // Increase timeout due to unpredictable I/O on CI services
- this.timeout(util.isRunningOnCI() ? 25000 : 5000);
- this.slow(300);
-
- const expectedPath = path.join(Config.getHomePath(), "logs", "testUser.sqlite3");
- let store: MessageStorage;
-
- function db_get_one(stmt: string, ...params: any[]): Promise {
- return new Promise((resolve, reject) => {
- store.database.serialize(() => {
- store.database.get(stmt, params, (err, row) => {
- if (err) {
- reject(err);
- return;
- }
-
- resolve(row);
- });
- });
- });
- }
-
- function db_get_mult(stmt: string, ...params: any[]): Promise {
- return new Promise((resolve, reject) => {
- store.database.serialize(() => {
- store.database.all(stmt, params, (err, rows) => {
- if (err) {
- reject(err);
- return;
- }
-
- resolve(rows);
- });
- });
- });
- }
-
- before(function (done) {
- store = new MessageStorage("testUser");
-
- // Delete database file from previous test run
- if (fs.existsSync(expectedPath)) {
- fs.unlink(expectedPath, done);
- } else {
- done();
- }
- });
-
- after(function (done) {
- // After tests run, remove the logs folder
- // so we return to the clean state
- fs.unlinkSync(expectedPath);
- fs.rmdir(path.join(Config.getHomePath(), "logs"), done);
- });
-
- it("should create database file", async function () {
- expect(store.isEnabled).to.be.false;
- expect(fs.existsSync(expectedPath)).to.be.false;
-
- await store.enable();
- expect(store.isEnabled).to.be.true;
- });
-
- it("should resolve an empty array when disabled", async function () {
- store.isEnabled = false;
- const messages = await store.getMessages(null as any, null as any, null as any);
- expect(messages).to.be.empty;
- store.isEnabled = true;
- });
-
- it("should insert schema version to options table", async function () {
- const row = await db_get_one("SELECT value FROM options WHERE name = 'schema_version'");
- expect(row.value).to.equal(currentSchemaVersion.toString());
- });
-
- it("should insert migrations", async function () {
- const row = await db_get_one(
- "SELECT id, version FROM migrations WHERE version = ?",
- currentSchemaVersion
- );
- expect(row).to.not.be.undefined;
- });
-
- it("should store a message", async function () {
- await store.index(
- {
- uuid: "this-is-a-network-guid",
- } as any,
- {
- name: "#thisISaCHANNEL",
- } as any,
- new Msg({
- time: 123456789,
- text: "Hello from sqlite world!",
- } as any)
- );
- });
-
- it("should retrieve previously stored message", async function () {
- let msgid = 0;
- const messages = await store.getMessages(
- {
- uuid: "this-is-a-network-guid",
- } as any,
- {
- name: "#thisisaCHANNEL",
- } as any,
- () => msgid++
- );
- expect(messages).to.have.lengthOf(1);
- const msg = messages[0];
- expect(msg.text).to.equal("Hello from sqlite world!");
- expect(msg.type).to.equal(MessageType.MESSAGE);
- expect(msg.time.getTime()).to.equal(123456789);
- });
-
- it("should retrieve latest LIMIT messages in order", async function () {
- const originalMaxHistory = Config.values.maxHistory;
-
- try {
- Config.values.maxHistory = 2;
-
- for (let i = 0; i < 200; ++i) {
- await store.index(
- {uuid: "retrieval-order-test-network"} as any,
- {name: "#channel"} as any,
- new Msg({
- time: 123456789 + i,
- text: `msg ${i}`,
- } as any)
- );
- }
-
- let msgId = 0;
- const messages = await store.getMessages(
- {uuid: "retrieval-order-test-network"} as any,
- {name: "#channel"} as any,
- () => msgId++
- );
- expect(messages).to.have.lengthOf(2);
- expect(messages.map((i_1) => i_1.text)).to.deep.equal(["msg 198", "msg 199"]);
- } finally {
- Config.values.maxHistory = originalMaxHistory;
- }
- });
-
- it("should search messages", async function () {
- const originalMaxHistory = Config.values.maxHistory;
-
- try {
- Config.values.maxHistory = 2;
-
- const search = await store.search({
- searchTerm: "msg",
- networkUuid: "retrieval-order-test-network",
- channelName: "",
- offset: 0,
- });
- expect(search.results).to.have.lengthOf(100);
- const expectedMessages: string[] = [];
-
- for (let i = 100; i < 200; ++i) {
- expectedMessages.push(`msg ${i}`);
- }
-
- expect(search.results.map((i_1) => i_1.text)).to.deep.equal(expectedMessages);
- } finally {
- Config.values.maxHistory = originalMaxHistory;
- }
- });
-
- it("should search messages with escaped wildcards", async function () {
- async function assertResults(query: string, expected: string[]) {
- const search = await store.search({
- searchTerm: query,
- networkUuid: "this-is-a-network-guid2",
- channelName: "",
- offset: 0,
- });
- expect(search.results.map((i) => i.text)).to.deep.equal(expected);
- }
-
- const originalMaxHistory = Config.values.maxHistory;
-
- try {
- Config.values.maxHistory = 3;
-
- await store.index(
- {uuid: "this-is-a-network-guid2"} as any,
- {name: "#channel"} as any,
- new Msg({
- time: 123456790,
- text: `foo % bar _ baz`,
- } as any)
- );
-
- await store.index(
- {uuid: "this-is-a-network-guid2"} as any,
- {name: "#channel"} as any,
- new Msg({
- time: 123456791,
- text: `foo bar x baz`,
- } as any)
- );
-
- await store.index(
- {uuid: "this-is-a-network-guid2"} as any,
- {name: "#channel"} as any,
- new Msg({
- time: 123456792,
- text: `bar @ baz`,
- } as any)
- );
-
- await assertResults("foo", ["foo % bar _ baz", "foo bar x baz"]);
- await assertResults("%", ["foo % bar _ baz"]);
- await assertResults("foo % bar ", ["foo % bar _ baz"]);
- await assertResults("_", ["foo % bar _ baz"]);
- await assertResults("bar _ baz", ["foo % bar _ baz"]);
- await assertResults("%%", []);
- await assertResults("@%", []);
- await assertResults("@", ["bar @ baz"]);
- } finally {
- Config.values.maxHistory = originalMaxHistory;
- }
- });
-
- it("should be able to downgrade", async function () {
- for (const rollback of rollbacks.slice().reverse()) {
- if (rollback.rollback_forbidden) {
- throw Error(
- "Try to write a down migration, if you really can't, flip this to a break"
- );
- }
-
- const new_version = await store.downgrade_to(rollback.version);
- expect(new_version).to.equal(rollback.version);
- }
- });
-
- it("should close database", async function () {
- await store.close();
- expect(fs.existsSync(expectedPath)).to.be.true;
- });
-});
-
-function dateAddDays(date: Date, days: number) {
- const ret = new Date(date.valueOf());
- ret.setDate(date.getDate() + days);
- return ret;
-}
diff --git a/test/plugins/storage.ts b/test/plugins/storage.ts
deleted file mode 100644
index 9f20daf0..00000000
--- a/test/plugins/storage.ts
+++ /dev/null
@@ -1,142 +0,0 @@
-import fs from "fs";
-import path from "path";
-import crypto from "crypto";
-import {expect} from "chai";
-import util from "../util";
-import Config from "../../server/config";
-import storage from "../../server/plugins/storage";
-import link from "../../server/plugins/irc-events/link";
-import {Request, Response} from "express";
-
-describe("Image storage", function () {
- // Increase timeout due to unpredictable I/O on CI services
- this.timeout(util.isRunningOnCI() ? 25000 : 5000);
- this.slow(300);
-
- const testImagePath = path.resolve(__dirname, "../../client/img/logo-grey-bg-120x120px.png");
- const correctImageHash = crypto
- .createHash("sha256")
- .update(fs.readFileSync(testImagePath))
- .digest("hex");
- const correctImageURL = `storage/${correctImageHash.substring(
- 0,
- 2
- )}/${correctImageHash.substring(2, 4)}/${correctImageHash.substring(4)}.png`;
-
- const testSvgPath = path.resolve(__dirname, "../../client/img/logo-grey-bg.svg");
- const correctSvgHash = crypto
- .createHash("sha256")
- .update(fs.readFileSync(testSvgPath))
- .digest("hex");
- const correctSvgURL = `storage/${correctSvgHash.substring(0, 2)}/${correctSvgHash.substring(
- 2,
- 4
- )}/${correctSvgHash.substring(4)}.svg`;
-
- before(function (done) {
- this.app = util.createWebserver();
- this.app.get("/real-test-image.png", function (req, res) {
- res.sendFile(testImagePath);
- });
- this.app.get("/logo.svg", function (req, res) {
- res.sendFile(testSvgPath);
- });
- this.connection = this.app.listen(0, "127.0.0.1", () => {
- this.port = this.connection.address().port;
- this.host = this.connection.address().address;
- done();
- });
- this._makeUrl = (_path: string): string => `http://${this.host}:${this.port}/${_path}`;
- });
-
- after(function (done) {
- this.connection.close(done);
- });
-
- after(function (done) {
- // After storage tests run, remove the remaining empty
- // storage folder so we return to the clean state
- const dir = Config.getStoragePath();
- fs.rmdir(dir, done);
- });
-
- beforeEach(function () {
- this.irc = util.createClient();
- this.network = util.createNetwork();
-
- Config.values.prefetchStorage = true;
- });
-
- afterEach(function () {
- Config.values.prefetchStorage = false;
- });
-
- it("should store the thumbnail", function (done) {
- const thumb_url = this._makeUrl("thumb");
- const message = this.irc.createMessage({
- text: thumb_url,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- const real_test_img_url = this._makeUrl("real-test-image.png");
- this.app.get("/thumb", function (req, res) {
- res.send(
- `Google `
- );
- });
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.head).to.equal("Google");
- expect(data.preview.link).to.equal(thumb_url);
- expect(data.preview.thumb).to.equal(correctImageURL);
- done();
- });
- });
-
- it("should store the image", function (done) {
- const real_test_img_url = this._makeUrl("real-test-image.png");
- const message = this.irc.createMessage({
- text: real_test_img_url,
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.type).to.equal("image");
- expect(data.preview.link).to.equal(real_test_img_url);
- expect(data.preview.thumb).to.equal(correctImageURL);
- done();
- });
- });
-
- it("should lookup correct extension type", function (done) {
- const msg_url = this._makeUrl("svg-preview");
- const message = this.irc.createMessage({
- text: msg_url,
- });
-
- const logo_url = this._makeUrl("logo.svg");
- this.app.get("/svg-preview", function (req: Request, res: Response) {
- res.send(`test title `);
- });
-
- link(this.irc, this.network.channels[0], message, message.text);
-
- this.irc.once("msg:preview", function (data) {
- expect(data.preview.type).to.equal("link");
- expect(data.preview.link).to.equal(msg_url);
- expect(data.preview.thumb).to.equal(correctSvgURL);
- done();
- });
- });
-
- it("should clear storage folder", function () {
- const dir = Config.getStoragePath();
-
- expect(fs.readdirSync(dir)).to.not.be.empty;
- storage.emptyDir();
- expect(fs.readdirSync(dir)).to.be.empty;
- expect(fs.existsSync(dir)).to.be.true;
- });
-});
diff --git a/test/server.ts b/test/server.ts
deleted file mode 100644
index d981312b..00000000
--- a/test/server.ts
+++ /dev/null
@@ -1,159 +0,0 @@
-import log from "../server/log";
-import Config from "../server/config";
-import {expect} from "chai";
-import got from "got";
-import io from "socket.io-client";
-import util from "./util";
-import changelog from "../server/plugins/changelog";
-
-import sinon from "ts-sinon";
-import ClientManager from "../server/clientManager";
-
-describe("Server", function () {
- // Increase timeout due to unpredictable I/O on CI services
- this.timeout(util.isRunningOnCI() ? 25000 : 5000);
-
- let server;
- let logInfoStub: sinon.SinonStub;
- let logWarnStub: sinon.SinonStub;
- let checkForUpdatesStub: sinon.SinonStub<[manager: ClientManager], void>;
-
- before(async function () {
- logInfoStub = sinon.stub(log, "info");
- logWarnStub = sinon.stub(log, "warn").callsFake((...args: string[]) => {
- // vapid.json permissions do not survive in git
- if (args.length > 1 && args[1] === "is world readable.") {
- return;
- }
-
- if (args.length > 0 && args[0].startsWith("run `chmod")) {
- return;
- }
-
- // eslint-disable-next-line no-console
- console.error(`Unhandled log.warn in server tests: ${args.join(" ")}`);
- });
-
- checkForUpdatesStub = sinon.stub(changelog, "checkForUpdates");
- server = await (await import("../server/server")).default({} as any);
- });
-
- after(function (done) {
- // Tear down test fixtures in the order they were setup,
- // in case setup crashed for any reason
- logInfoStub.restore();
- logWarnStub.restore();
- checkForUpdatesStub.restore();
- server.close(done);
- });
-
- const webURL = `http://${Config.values.host}:${Config.values.port}/`;
-
- describe("Express", () => {
- it("should run a web server on " + webURL, async () => {
- const response = await got(webURL);
- expect(response.statusCode).to.equal(200);
- expect(response.body).to.include("The Lounge ");
- expect(response.body).to.include("js/bundle.js");
- });
-
- it("should serve static content correctly", async () => {
- const response = await got(webURL + "thelounge.webmanifest");
- const body = JSON.parse(response.body);
-
- expect(response.statusCode).to.equal(200);
- expect(body.name).to.equal("The Lounge");
- expect(response.headers["content-type"]).to.equal("application/manifest+json");
- });
- });
-
- describe("WebSockets", function () {
- this.slow(300);
-
- let client: ReturnType;
-
- beforeEach(() => {
- client = io(webURL, {
- path: "/socket.io/",
- autoConnect: false,
- reconnection: false,
- timeout: 1000,
- transports: ["websocket"],
- });
-
- // Server emits events faster than the test can bind them
- setTimeout(() => {
- client.open();
- }, 1);
- });
-
- afterEach(() => {
- client.close();
- });
-
- it("should emit authorized message", (done) => {
- client.on("auth:success", done);
- });
-
- it("should create network", (done) => {
- client.on("init", () => {
- client.emit("network:new", {
- username: "test-user",
- realname: "The Lounge Test",
- nick: "test-user",
- join: "#thelounge, #spam",
- name: "Test Network",
- host: Config.values.host,
- port: 6667,
- });
- });
-
- client.on("network", (data) => {
- expect(data.network).to.exist;
- expect(data.network.nick).to.equal("test-user");
- expect(data.network.name).to.equal("Test Network");
- expect(data.network.channels).to.have.lengthOf(3);
- expect(data.network.channels[0].name).to.equal("Test Network");
- expect(data.network.channels[1].name).to.equal("#thelounge");
- expect(data.network.channels[2].name).to.equal("#spam");
- done();
- });
- });
-
- it("should emit configuration message", (done) => {
- client.on("configuration", (data) => {
- // Private key defined in vapid.json is "01020304050607080910111213141516" for this public key.
- expect(data.applicationServerKey).to.equal(
- "BM0eTDpvDnH7ewlHuXWcPTE1NjlJ06XWIS1cQeBTZmsg4EDx5sOpY7kdX1pniTo8RakL3UdfFuIbC8_zog_BWIM"
- );
-
- expect(data.public).to.equal(true);
- expect(data.defaultTheme).to.equal("default");
- expect(data.themes).to.be.an("array");
- expect(data.lockNetwork).to.equal(false);
- expect(data.useHexIp).to.equal(false);
-
- done();
- });
- });
-
- it("should emit push subscription state message", (done) => {
- client.on("push:issubscribed", (data) => {
- expect(data).to.be.false;
-
- done();
- });
- });
-
- it("should emit init message", (done) => {
- client.on("init", (data) => {
- expect(data.active).to.equal(-1);
- expect(data.networks).to.be.an("array");
- expect(data.networks).to.be.empty;
- expect(data.token).to.be.undefined;
-
- done();
- });
- });
- });
-});
diff --git a/test/shared/cleanIrcMessage.ts b/test/shared/cleanIrcMessage.ts
deleted file mode 100644
index 1cc1ff49..00000000
--- a/test/shared/cleanIrcMessage.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import {expect} from "chai";
-import {cleanIrcMessage} from "../../shared/irc";
-
-describe("cleanIrcMessage", function () {
- it("should remove all formatting", function () {
- const testCases = [
- {
- input: "\x0303",
- expected: "",
- },
- {
- input: "\x02bold",
- expected: "bold",
- },
- {
- input: "\x038yellowText",
- expected: "yellowText",
- },
- {
- input: "\x030,0white,white",
- expected: "white,white",
- },
- {
- input: "\x034,8yellowBGredText",
- expected: "yellowBGredText",
- },
- {
- input: "\x1ditalic",
- expected: "italic",
- },
- {
- input: "\x1estrikethrough",
- expected: "strikethrough",
- },
- {
- input: "\x11monospace",
- expected: "monospace",
- },
- {
- input: "\x16reset color",
- expected: "reset color",
- },
- {
- input: "\x1funderline",
- expected: "underline",
- },
- {
- input: "\x02bold\x038yellow\x02nonBold\x03default",
- expected: "boldyellownonBolddefault",
- },
- {
- input: "\x02bold\x02 \x02bold\x02",
- expected: "bold bold",
- },
- {
- input: "\x02irc\x0f://\x1dirc.example.com\x0f/\x034,8thelounge",
- expected: "irc://irc.example.com/thelounge",
- },
- {
- input: "\x02#\x038,9thelounge",
- expected: "#thelounge",
- },
- {
- input: "\x04DDEEAA,BBEEFF#\x038,9thelou\x04FFAACC\x0311\x04nge",
- expected: "#thelounge",
- },
- {
- input: "\x04ddEEffhex\x04 color\x04EEffCC,AAaaCC clean",
- expected: "hex color clean",
- },
- {
- input: "\x04 AAaaAA\x03 11 \x04Invalid,Hex ",
- expected: "AAaaAA 11 Invalid,Hex",
- },
- ];
-
- const actual = testCases.map((testCase) => cleanIrcMessage(testCase.input));
- const expected = testCases.map((testCase) => testCase.expected);
-
- expect(actual).to.deep.equal(expected);
- });
-});
diff --git a/test/shared/findLinks.ts b/test/shared/findLinks.ts
deleted file mode 100644
index 35cd244f..00000000
--- a/test/shared/findLinks.ts
+++ /dev/null
@@ -1,458 +0,0 @@
-import {expect} from "chai";
-import {findLinks, findLinksWithSchema} from "../../shared/linkify";
-
-describe("findLinks", () => {
- it("should find url", () => {
- const input = "irc://irc.example.com/thelounge";
- const expected = [
- {
- start: 0,
- end: 31,
- link: "irc://irc.example.com/thelounge",
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find urls with www", () => {
- const input = "www.nooooooooooooooo.com";
- const expected = [
- {
- start: 0,
- end: 24,
- link: "http://www.nooooooooooooooo.com",
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find urls in strings", () => {
- const input = "look at https://thelounge.chat/ for more information";
- const expected = [
- {
- link: "https://thelounge.chat/",
- start: 8,
- end: 31,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find urls in strings starting with www", () => {
- const input = "use www.duckduckgo.com for privacy reasons";
- const expected = [
- {
- link: "http://www.duckduckgo.com",
- start: 4,
- end: 22,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find urls with odd surroundings", () => {
- const input = "";
- const expected = [
- {
- link: "https://theos.kyriasis.com/~kyrias/stats/archlinux.html",
- start: 1,
- end: 56,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find urls with starting with http:// and odd surroundings", () => {
- const input = ".:http://www.github.com:. .:www.github.com:.";
- const expected = [
- {
- link: "http://www.github.com",
- start: 2,
- end: 23,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not find urls", () => {
- const input = "text www. text";
- const expected = [];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should handle multiple www. correctly", () => {
- const input = "www.www.test.com";
- const expected = [
- {
- link: "http://www.www.test.com",
- start: 0,
- end: 16,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find domains without www. but valid tld", () => {
- const input = "google.com google.lv google.museum";
- const expected = [
- {
- link: "http://google.com",
- start: 0,
- end: 10,
- },
- {
- link: "http://google.lv",
- start: 11,
- end: 20,
- },
- {
- link: "http://google.museum",
- start: 21,
- end: 34,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find .onion domains", () => {
- const input = "facebookcorewwwi.onion/test?url";
- const expected = [
- {
- link: "http://facebookcorewwwi.onion/test?url",
- start: 0,
- end: 31,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not consider invalid TLDs as domains", () => {
- const input = "google.wtfgugl google.xx www.google.wtfgugl www.google.xx";
- const expected = [];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should consider invalid TLDs as domains if protocol is specified", () => {
- const input =
- "http://google.wtfgugl http://google.xx http://www.google.wtfgugl http://www.google.xx";
- const expected = [
- {
- link: "http://google.wtfgugl",
- start: 0,
- end: 21,
- },
- {
- link: "http://google.xx",
- start: 22,
- end: 38,
- },
- {
- link: "http://www.google.wtfgugl",
- start: 39,
- end: 64,
- },
- {
- link: "http://www.google.xx",
- start: 65,
- end: 85,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should correctly stop at punctuation", () => {
- // Issue #2351
- const input =
- "https://en.wikipedia.org/wiki/Dig! " +
- "https://en.wikipedia.org/wiki/Dig? " +
- "https://en.wikipedia.org/wiki/Dig. " +
- "https://www.google.com* " +
- "https://www.google.com/test* " +
- "https://www.google.com@ " +
- "https://www.google.com/test@ " +
- "https://www.google.com! ";
- const expected = [
- {
- link: "https://en.wikipedia.org/wiki/Dig",
- start: 0,
- end: 33,
- },
- {
- link: "https://en.wikipedia.org/wiki/Dig",
- start: 35,
- end: 68,
- },
- {
- link: "https://en.wikipedia.org/wiki/Dig",
- start: 70,
- end: 103,
- },
- {
- link: "https://www.google.com",
- start: 105,
- end: 127,
- },
- {
- link: "https://www.google.com/test*",
- start: 129,
- end: 157,
- },
- {
- link: "https://www.google.com",
- start: 158,
- end: 180,
- },
- {
- link: "https://www.google.com/test@",
- start: 182,
- end: 210,
- },
- {
- link: "https://www.google.com",
- start: 211,
- end: 233,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should correctly stop at apostrophe", () => {
- const input = "https://www.google.com's www.google.com's google.com's"; // Issue #1302
- const expected = [
- {
- link: "https://www.google.com",
- start: 0,
- end: 22,
- },
- {
- link: "http://www.google.com",
- start: 25,
- end: 39,
- },
- {
- link: "http://google.com",
- start: 42,
- end: 52,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("does not find invalid urls", () => {
- const input = "www.example.com ssh://-oProxyCommand=whois"; // Issue #1412
- const expected = [
- {
- start: 0,
- end: 15,
- link: "http://www.example.com",
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
-
- const input2 = "www.example.com http://root:'some%pass'@hostname/database"; // Issue #1618
- const expected2 = [
- {
- start: 0,
- end: 15,
- link: "http://www.example.com",
- },
- {
- start: 16,
- end: 57,
- link: "http://root:'some%pass'@hostname/database",
- },
- ];
-
- const actual2 = findLinks(input2);
-
- expect(actual2).to.deep.equal(expected2);
- });
-
- it("keeps parsing after finding an invalid url", () => {
- const input = "www.example.com http://a:%p@c http://thelounge.chat";
- const expected = [
- {
- start: 0,
- end: 15,
- link: "http://www.example.com",
- },
- {
- start: 16,
- end: 29,
- link: "http://a:%p@c",
- },
- {
- start: 30,
- end: 51,
- link: "http://thelounge.chat",
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should add protocol to protocol-aware urls", () => {
- const input = "//example.com";
- const expected = [
- {
- link: "http://example.com",
- start: 0,
- end: 13,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should parse mailto links", () => {
- const input = "mail@example.com mailto:mail@example.org";
- const expected = [
- {
- link: "mailto:mail@example.com",
- start: 0,
- end: 16,
- },
- {
- link: "mailto:mail@example.org",
- start: 17,
- end: 40,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should not return urls with no schema if flag is specified", () => {
- const input = "https://example.global //example.com http://example.group example.py";
- const expected = [
- {
- link: "https://example.global",
- start: 0,
- end: 22,
- },
- {
- end: 57,
- link: "http://example.group",
- start: 37,
- },
- ];
-
- const actual = findLinksWithSchema(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should use http for protocol-less URLs", () => {
- const input = "//example.com";
- const expected = [
- {
- link: "http://example.com",
- start: 0,
- end: 13,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find web+ schema urls", () => {
- const input = "web+ap://instance.example/@Example web+whatever://example.com?some=value";
- const expected = [
- {
- link: "web+ap://instance.example/@Example",
- start: 0,
- end: 34,
- },
- {
- link: "web+whatever://example.com?some=value",
- start: 35,
- end: 72,
- },
- ];
-
- const actual = findLinks(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should find web+ schema urls if scheme required flag is specified", () => {
- const input =
- "web+ap://instance.example/@Example web+Whatever://example.com?some=value example.org";
- const expected = [
- {
- link: "web+ap://instance.example/@Example",
- start: 0,
- end: 34,
- },
- {
- link: "web+Whatever://example.com?some=value",
- start: 35,
- end: 72,
- },
- ];
-
- const actual = findLinksWithSchema(input);
-
- expect(actual).to.deep.equal(expected);
- });
-
- it("should disregard invalid web+ links", () => {
- const input = "web+://whatever.example";
- const actual = findLinksWithSchema(input);
-
- expect(actual).to.be.empty;
- });
-});
diff --git a/test/shared/irc.ts b/test/shared/irc.ts
deleted file mode 100644
index fb0d7168..00000000
--- a/test/shared/irc.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import {expect} from "chai";
-import {condensedTypes} from "../../shared/irc";
-
-describe(".condensedTypes", function () {
- it("should be a non-empty array", function () {
- expect(condensedTypes).to.be.an.instanceof(Set).that.is.not.empty;
- });
-
- it("should only contain ASCII strings", function () {
- condensedTypes.forEach((type) => {
- expect(type).to.be.a("string").that.does.match(/^\w+$/);
- });
- });
-});
diff --git a/test/src/command-line/utilsTest.ts b/test/src/command-line/utilsTest.ts
deleted file mode 100644
index d4348368..00000000
--- a/test/src/command-line/utilsTest.ts
+++ /dev/null
@@ -1,161 +0,0 @@
-import log from "../../../server/log";
-import {expect} from "chai";
-import TestUtil from "../../util";
-import Utils from "../../../server/command-line/utils";
-import sinon from "ts-sinon";
-
-describe("Utils", function () {
- describe(".extraHelp", function () {
- it("should start and end with empty lines to display correctly with --help", function () {
- // Mock `log.raw` to extract its effect into an array
- const stdout: string[] = [];
- const logRawStub = sinon
- .stub(log, "raw")
- .callsFake(TestUtil.sanitizeLog((str) => stdout.push(str)));
-
- Utils.extraHelp();
-
- logRawStub.restore();
-
- // Starts with 1 empty line
- expect(stdout[0]).to.equal("\n");
- expect(stdout[1]).to.not.equal("\n");
-
- // Ends with 1 empty line
- expect(stdout[stdout.length - 2]).to.not.equal("\n");
- expect(stdout[stdout.length - 1]).to.equal("\n");
- });
-
- it("should contain information about THELOUNGE_HOME env var", function () {
- // Mock `log.raw` to extract its effect into a concatenated string
- let stdout = "";
-
- const logRawStub = sinon
- .stub(log, "raw")
- .callsFake(TestUtil.sanitizeLog((str) => (stdout += str)));
-
- Utils.extraHelp();
-
- logRawStub.restore();
-
- expect(stdout).to.include("THELOUNGE_HOME");
- });
- });
-
- describe(".parseConfigOptions", function () {
- describe("when it's the first option given", function () {
- it("should return nothing when passed an invalid config", function () {
- expect(Utils.parseConfigOptions("foo")).to.be.undefined;
- });
-
- it("should correctly parse boolean values", function () {
- expect(Utils.parseConfigOptions("foo=true")).to.deep.equal({foo: true});
- expect(Utils.parseConfigOptions("foo=false")).to.deep.equal({foo: false});
- });
-
- it("should correctly parse empty strings", function () {
- expect(Utils.parseConfigOptions("foo=")).to.deep.equal({foo: ""});
- expect(Utils.parseConfigOptions("foo= ")).to.deep.equal({foo: " "});
- });
-
- it("should correctly parse null values", function () {
- expect(Utils.parseConfigOptions("foo=null")).to.deep.equal({foo: null});
- });
-
- it("should correctly parse undefined values", function () {
- expect(Utils.parseConfigOptions("foo=undefined")).to.deep.equal({foo: undefined});
- });
-
- it("should correctly parse array values", function () {
- expect(Utils.parseConfigOptions("foo=[bar,true]")).to.deep.equal({
- foo: ["bar", true],
- });
-
- expect(Utils.parseConfigOptions("foo=[bar, true]")).to.deep.equal({
- foo: ["bar", true],
- });
- });
-
- it("should correctly parse empty array values", function () {
- expect(Utils.parseConfigOptions("foo=[]")).to.deep.equal({foo: []});
- });
-
- it("should correctly parse values that contain `=` sign", function () {
- expect(Utils.parseConfigOptions("foo=bar=42")).to.deep.equal({foo: "bar=42"});
- });
-
- it("should correctly parse keys using dot-notation", function () {
- expect(Utils.parseConfigOptions("foo.bar=value")).to.deep.equal({
- foo: {bar: "value"},
- });
- });
-
- it("should correctly parse keys using array-notation", function () {
- expect(Utils.parseConfigOptions("foo[0]=value")).to.deep.equal({foo: ["value"]});
- });
-
- it("should correctly change type to number", function () {
- expect(Utils.parseConfigOptions("foo=1337")).to.deep.equal({foo: 1337});
- expect(Utils.parseConfigOptions("foo=5")).to.deep.equal({foo: 5});
- expect(Utils.parseConfigOptions("foo=0")).to.deep.equal({foo: 0});
- expect(Utils.parseConfigOptions("foo=9876543210")).to.deep.equal({foo: 9876543210});
- expect(Utils.parseConfigOptions("foo=0987654321")).to.deep.equal({foo: 987654321});
- expect(Utils.parseConfigOptions("foo=-1")).to.deep.equal({foo: -1});
- expect(Utils.parseConfigOptions("foo=-0")).to.deep.equal({foo: -0});
- });
- });
-
- describe("when some options have already been parsed", function () {
- it("should not modify existing options when passed an invalid config", function () {
- const memo = {foo: "bar"};
- expect(Utils.parseConfigOptions("foo", memo)).to.equal(memo);
- });
-
- it("should combine a new option with previously parsed ones", function () {
- expect(Utils.parseConfigOptions("bar=false", {foo: true})).to.deep.equal({
- foo: true,
- bar: false,
- });
- });
-
- it("should maintain existing properties of a nested object", function () {
- expect(Utils.parseConfigOptions("foo.bar=true", {foo: {baz: false}})).to.deep.equal(
- {foo: {bar: true, baz: false}}
- );
- });
-
- it("should maintain existing entries of an array", function () {
- expect(Utils.parseConfigOptions("foo[1]=baz", {foo: ["bar"]})).to.deep.equal({
- foo: ["bar", "baz"],
- });
- });
-
- describe("when given the same key multiple times", function () {
- it("should not override options", function () {
- const logWarnStub = sinon.stub(log, "warn");
-
- const parsed = Utils.parseConfigOptions("foo=baz", {foo: "bar"});
-
- logWarnStub.restore();
-
- expect(parsed).to.deep.equal({
- foo: "bar",
- });
- });
-
- it("should display a warning", function () {
- let warning = "";
- const logWarnStub = sinon
- .stub(log, "warn")
- .callsFake(TestUtil.sanitizeLog((str) => (warning += str)));
-
- Utils.parseConfigOptions("foo=bar", {foo: "baz"});
-
- logWarnStub.restore();
-
- expect(warning).to.include("foo was already specified");
- });
- });
- });
- });
-});
diff --git a/test/src/helperTest.ts b/test/src/helperTest.ts
deleted file mode 100644
index 2a8ddc81..00000000
--- a/test/src/helperTest.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import {expect} from "chai";
-import os from "os";
-import Helper from "../../server/helper";
-
-describe("Helper", function () {
- describe("#expandHome", function () {
- it("should correctly expand a Unix path", function () {
- expect([`${os.homedir()}/tmp`, `${os.homedir()}\\tmp`]).to.include(
- Helper.expandHome("~/tmp")
- );
- });
-
- it("should correctly expand a Windows path", function () {
- expect(Helper.expandHome("~\\tmp")).to.equal(`${os.homedir()}\\tmp`);
- });
-
- it("should correctly expand when not given a specific path", function () {
- expect(Helper.expandHome("~")).to.equal(os.homedir());
- });
-
- it("should not expand paths not starting with tilde", function () {
- expect(Helper.expandHome("/tmp")).to.match(/^\/tmp|[a-zA-Z]:\\{1,2}tmp$/);
- });
-
- it("should not expand a tilde in the middle of a string", function () {
- expect(Helper.expandHome("/tmp/~foo")).to.match(
- /^\/tmp\/~foo|[a-zA-Z]:\\{1,2}?tmp\\{1,2}~foo$/
- );
- });
-
- it("should return an empty string when given an empty string", function () {
- expect(Helper.expandHome("")).to.equal("");
- });
-
- it("should return an empty string when given undefined", function () {
- expect(Helper.expandHome(undefined as any)).to.equal("");
- });
- });
-
- describe("#getVersion()", function () {
- const version = Helper.getVersion();
-
- it("should mention it is served from source code", function () {
- expect(version).to.include("source");
- });
-
- it("should include a short Git SHA", function () {
- expect(version).to.match(/\([0-9a-f]{7,11} /);
- });
-
- it("should include a valid semver version", function () {
- expect(version).to.match(/v[0-9]+\.[0-9]+\.[0-9]+/);
- });
- });
-});
diff --git a/test/tests/build.ts b/test/tests/build.ts
deleted file mode 100644
index 1f833d04..00000000
--- a/test/tests/build.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import {expect} from "chai";
-import fs from "fs";
-import path from "path";
-
-describe("public folder", function () {
- const publicFolder = path.join(__dirname, "..", "..", "public");
-
- it("font awesome files are copied", function () {
- expect(fs.existsSync(path.join(publicFolder, "fonts", "fa-solid-900.woff"))).to.be.true;
- expect(fs.existsSync(path.join(publicFolder, "fonts", "fa-solid-900.woff2"))).to.be.true;
- });
-
- it("files in root folder are copied", function () {
- expect(fs.existsSync(path.join(publicFolder, "favicon.ico"))).to.be.true;
- expect(fs.existsSync(path.join(publicFolder, "robots.txt"))).to.be.true;
- expect(fs.existsSync(path.join(publicFolder, "service-worker.js"))).to.be.true;
- expect(fs.existsSync(path.join(publicFolder, "thelounge.webmanifest"))).to.be.true;
- });
-
- it("audio files are copied", function () {
- expect(fs.existsSync(path.join(publicFolder, "audio", "pop.wav"))).to.be.true;
- });
-
- it("index HTML file is not copied", function () {
- expect(fs.existsSync(path.join(publicFolder, "index.html"))).to.be.false;
- expect(fs.existsSync(path.join(publicFolder, "index.html.tpl"))).to.be.false;
- });
-
- it("javascript files are built", function () {
- expect(fs.existsSync(path.join(publicFolder, "js", "bundle.js"))).to.be.true;
- expect(fs.existsSync(path.join(publicFolder, "js", "bundle.vendor.js"))).to.be.true;
- });
-
- it("style files are built", function () {
- expect(fs.existsSync(path.join(publicFolder, "css", "style.css"))).to.be.true;
- expect(fs.existsSync(path.join(publicFolder, "css", "style.css.map"))).to.be.true;
- expect(fs.existsSync(path.join(publicFolder, "themes", "default.css"))).to.be.true;
- expect(fs.existsSync(path.join(publicFolder, "themes", "morning.css"))).to.be.true;
- });
-
- it("style files contain expected content", function (done) {
- fs.readFile(path.join(publicFolder, "css", "style.css"), "utf8", function (err, contents) {
- expect(err).to.be.null;
-
- expect(contents.includes("var(--body-color)")).to.be.true;
- expect(contents.includes("url(../fonts/fa-solid-900.woff2)")).to.be.true;
- expect(contents.includes(".tooltipped{position:relative}")).to.be.true;
- expect(contents.includes("sourceMappingURL")).to.be.true;
-
- done();
- });
- });
-
- it("javascript map is created", function () {
- expect(fs.existsSync(path.join(publicFolder, "js", "bundle.js.map"))).to.be.true;
- });
-
- it("loading-error-handlers.js is copied", function () {
- expect(fs.existsSync(path.join(publicFolder, "js", "loading-error-handlers.js"))).to.be
- .true;
- });
-
- it("service worker has cacheName set", function (done) {
- fs.readFile(path.join(publicFolder, "service-worker.js"), "utf8", function (err, contents) {
- expect(err).to.be.null;
-
- expect(contents.includes("const cacheName")).to.be.true;
- expect(contents.includes("__HASH__")).to.be.false;
-
- done();
- });
- });
-});
diff --git a/test/tests/customhighlights.ts b/test/tests/customhighlights.ts
deleted file mode 100644
index 30f84c01..00000000
--- a/test/tests/customhighlights.ts
+++ /dev/null
@@ -1,150 +0,0 @@
-import {expect} from "chai";
-import log from "../../server/log";
-import Client from "../../server/client";
-import TestUtil from "../util";
-import sinon from "ts-sinon";
-
-describe("Custom highlights", function () {
- let userLoadedLog = "";
- const logInfoStub = sinon.stub(log, "info");
- logInfoStub.callsFake(TestUtil.sanitizeLog((str) => (userLoadedLog += str)));
-
- const client = new Client(
- {
- clients: [],
- getDataToSave() {
- return {
- newUser: "",
- newHash: "",
- };
- },
- } as any,
- "test",
- {
- clientSettings: {
- highlights: "foo, @all, sp ace , 고",
- highlightExceptions: "foo bar, bar @all, test sp ace test",
- },
- } as any
- );
- client.connect();
- logInfoStub.restore();
- expect(userLoadedLog).to.equal("User test loaded\n");
-
- it("should NOT highlight", function () {
- const teststrings = [
- "and foos stuff",
- "test foobar",
- "testfoo bar",
- "fooö",
- "wtf@all",
- "foo고",
- "test고",
- "space",
- "sp:ace",
- ];
-
- for (const teststring of teststrings) {
- expect(teststring).to.not.match(client.highlightRegex!);
- }
- });
-
- it("should highlight", function () {
- const teststrings = [
- "Hey foo hello",
- "hey Foo: hi",
- "hey Foo, hi",
- " testing",
- "foo",
- "hey @all test",
- "testing foo's stuff",
- '"foo"',
- '"@all"',
- "foo!",
- "www.foo.bar",
- "www.bar.foo/page",
- "고",
- "test 고",
- "고!",
- "www.고.com",
- "hey @Foo",
- "hey ~Foo",
- "hey +Foo",
- "hello &foo",
- "@all",
- "@all wtf",
- "wtf @all",
- "@@all",
- "@고",
- "f00 sp ace: bar",
- ];
-
- for (const teststring of teststrings) {
- expect(teststring).to.match(client.highlightRegex!);
- }
- });
-
- it("should trim custom highlights in the compiled regex", function () {
- expect(client.highlightRegex).to.match(/\(\?:foo\|@all\|sp ace\|고\)/);
- });
-
- it("should NOT compile a regex", function () {
- // test updating the regex and invalid custom hl inputs
- client.config.clientSettings.highlights = ",,";
- client.compileCustomHighlights();
- expect(client.highlightRegex).to.be.null;
-
- client.config.clientSettings.highlights = " ";
- client.compileCustomHighlights();
- expect(client.highlightRegex).to.be.null;
- });
-
- // tests for highlight exceptions
- it("should NOT highlight due to highlight exceptions", function () {
- const teststrings = [
- "foo bar baz",
- "test foo bar",
- "foo bar @all test",
- "with a test sp ace test",
- ];
-
- for (const teststring of teststrings) {
- expect(teststring).to.match(client.highlightExceptionRegex!);
- }
- });
-
- it("should highlight regardless of highlight exceptions", function () {
- const teststrings = [
- "Hey foo hello",
- "hey Foo: hi",
- "hey Foo, hi",
- " testing",
- "foo",
- "hey @all test",
- "testing foo's stuff",
- '"foo"',
- '"@all"',
- "foo!",
- "www.foo.bar",
- "www.bar.foo/page",
- "고",
- "test 고",
- "고!",
- "www.고.com",
- "hey @Foo",
- "hey ~Foo",
- "hey +Foo",
- "hello &foo",
- "@all",
- "@all wtf",
- "wtfbar @all",
- "@@all",
- "@고",
- "f00 sp ace: bar",
- ];
-
- for (const teststring of teststrings) {
- expect(teststring).to.not.match(client.highlightExceptionRegex!);
- }
- });
-});
diff --git a/test/tests/hexip.ts b/test/tests/hexip.ts
deleted file mode 100644
index 3bc8d6dd..00000000
--- a/test/tests/hexip.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import {expect} from "chai";
-import Helper from "../../server/helper";
-
-describe("HexIP", function () {
- it("should correctly convert IPv4 to hex", function () {
- expect(Helper.ip2hex("66.124.160.150")).to.equal("427ca096");
- expect(Helper.ip2hex("127.0.0.1")).to.equal("7f000001");
- expect(Helper.ip2hex("0.0.0.255")).to.equal("000000ff");
- });
-
- it("unsupported addresses return default", function () {
- expect(Helper.ip2hex("0.0.0.999")).to.equal("00000000");
- expect(Helper.ip2hex("localhost")).to.equal("00000000");
- expect(Helper.ip2hex("::1")).to.equal("00000000");
- expect(Helper.ip2hex("2606:2800:220:1:248:1893:25c8:1946")).to.equal("00000000");
- });
-});
diff --git a/test/tests/hostmask.ts b/test/tests/hostmask.ts
deleted file mode 100644
index a6c768eb..00000000
--- a/test/tests/hostmask.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import {expect} from "chai";
-import Helper from "../../server/helper";
-
-describe("Hostmask", function () {
- it(".parseHostmask", function () {
- expect(Helper.parseHostmask("nick").nick).to.equal("nick");
- expect(Helper.parseHostmask("nick").ident).to.equal("*");
- expect(Helper.parseHostmask("nick").hostname).to.equal("*");
-
- expect(Helper.parseHostmask("!user").nick).to.equal("*");
- expect(Helper.parseHostmask("!user").ident).to.equal("user");
- expect(Helper.parseHostmask("!user").hostname).to.equal("*");
-
- expect(Helper.parseHostmask("@host").nick).to.equal("*");
- expect(Helper.parseHostmask("@host").ident).to.equal("*");
- expect(Helper.parseHostmask("@host").hostname).to.equal("host");
-
- expect(Helper.parseHostmask("!").nick).to.equal("*");
- expect(Helper.parseHostmask("!").ident).to.equal("*");
- expect(Helper.parseHostmask("!").hostname).to.equal("*");
-
- expect(Helper.parseHostmask("@").nick).to.equal("*");
- expect(Helper.parseHostmask("@").ident).to.equal("*");
- expect(Helper.parseHostmask("@").hostname).to.equal("*");
-
- expect(Helper.parseHostmask("!@").nick).to.equal("*");
- expect(Helper.parseHostmask("!@").ident).to.equal("*");
- expect(Helper.parseHostmask("!@").hostname).to.equal("*");
-
- expect(Helper.parseHostmask("nick!user@host").nick).to.equal("nick");
- expect(Helper.parseHostmask("nick!user@host").ident).to.equal("user");
- expect(Helper.parseHostmask("nick!user@host").hostname).to.equal("host");
-
- expect(Helper.parseHostmask("nick!!!!@thing@@host").nick).to.equal("nick");
- expect(Helper.parseHostmask("nick!!!!@thing@@host").ident).to.equal("*");
- expect(Helper.parseHostmask("nick!!!!@thing@@host").hostname).to.equal("thing");
-
- expect(Helper.parseHostmask("!!!!@thing@@host").nick).to.equal("*");
- expect(Helper.parseHostmask("!!!!@thing@@host").ident).to.equal("*");
- expect(Helper.parseHostmask("!!!!@thing@@host").hostname).to.equal("thing");
-
- expect(Helper.parseHostmask("NiCK!uSEr@HOST").nick).to.equal("nick");
- expect(Helper.parseHostmask("NiCK!uSEr@HOST").ident).to.equal("user");
- expect(Helper.parseHostmask("NiCK!uSEr@HOST").hostname).to.equal("host");
- });
-
- it(".compareHostmask (wildcard)", function () {
- const a = Helper.parseHostmask("nick!user@host");
- const b = Helper.parseHostmask("n?ck!*@*");
- expect(Helper.compareHostmask(b, a)).to.be.true;
- expect(Helper.compareHostmask(a, b)).to.be.false;
- });
-
- it(".compareHostmask (wildcard - partial)", function () {
- const a = Helper.parseHostmask("nicky!user@host");
- const b = Helper.parseHostmask("nick*!*e?@?os*");
- expect(Helper.compareHostmask(b, a)).to.be.true;
- expect(Helper.compareHostmask(a, b)).to.be.false;
- });
-
- it(".compareHostmask", function () {
- const a = Helper.parseHostmask("nick!user@host");
- const b = Helper.parseHostmask("NiCK!useR@HOST");
- expect(Helper.compareHostmask(b, a)).to.be.true;
- expect(Helper.compareHostmask(a, b)).to.be.true;
- });
-});
-
-describe("compareWithWildcard", function () {
- const goodPairs = [
- ["asdf", "asdf"],
- ["AsDf", "asdf"],
- ["a?df*", "asdf"],
- ["*asdf*", "asdf"],
- ["*asdf", "asdf"],
- ["asd?", "asdf"],
- ["asd?*", "asdf"],
- ["a??f", "asdf"],
- ["a*", "asdf"],
- ["*f", "asdf"],
- ["*s*", "asdf"],
- ["*", ""],
- ["**", ""],
- ];
-
- for (const t of goodPairs) {
- it(`("${t[0]}", "${t[1]}")`, function () {
- expect(Helper.compareWithWildcard(t[0], t[1])).to.be.true;
- });
- }
-
- const badPairs = [
- ["asdf", "fdsa"],
- ["a?df*", "adfg"],
- ["?", ""],
- ["?asdf", "asdf"],
- ["?*", ""],
- ["*?*", ""],
- ["*?", ""],
- ["asd", "asdf"],
- ["sdf", "asdf"],
- ["sd", "asdf"],
- ["", "asdf"],
- ];
-
- for (const t of badPairs) {
- it(`("${t[0]}", "${t[1]}")`, function () {
- expect(Helper.compareWithWildcard(t[0], t[1])).to.be.false;
- });
- }
-});
diff --git a/test/tests/mergeConfig.ts b/test/tests/mergeConfig.ts
deleted file mode 100644
index 570fb313..00000000
--- a/test/tests/mergeConfig.ts
+++ /dev/null
@@ -1,286 +0,0 @@
-import {expect} from "chai";
-import sinon from "ts-sinon";
-
-import log from "../../server/log";
-import Config from "../../server/config";
-import TestUtil from "../util";
-
-describe("mergeConfig", function () {
- it("should mutate object", function () {
- const config = {
- ip: "default",
- } as any;
-
- expect(
- Config._merge_config_objects(config, {
- ip: "overridden",
- } as any)
- ).to.deep.equal({
- ip: "overridden",
- });
-
- expect(config).to.deep.equal({
- ip: "overridden",
- });
- });
-
- it("should merge new properties", function () {
- expect(
- Config._merge_config_objects(
- {
- ip: "default",
- newProp: "this should appear too",
- } as any,
- {
- ip: "overridden",
- } as any
- )
- ).to.deep.equal({
- ip: "overridden",
- newProp: "this should appear too",
- });
- });
-
- it("should extend objects", function () {
- expect(
- Config._merge_config_objects(
- {
- tlsOptions: {},
- } as any,
- {
- tlsOptions: {
- user: "test",
- thing: 123,
- },
- } as any
- )
- ).to.deep.equal({
- tlsOptions: {
- user: "test",
- thing: 123,
- },
- });
- });
-
- it("should warn for unknown top level keys", function () {
- let warning = "";
- const warnStub = sinon
- .stub(log, "warn")
- .callsFake(TestUtil.sanitizeLog((str) => (warning += str)));
-
- expect(
- Config._merge_config_objects(
- {
- optionOne: 123,
- } as any,
- {
- optionOne: 456,
- optionTwo: 789,
- } as any
- )
- ).to.deep.equal({
- optionOne: 456,
- optionTwo: 789,
- });
-
- warnStub.restore();
- expect(warning).to.equal('Unknown key "optionTwo", please verify your config.\n');
- });
-
- it("should not warn for unknown second level keys", function () {
- expect(
- Config._merge_config_objects(
- {
- optionOne: {
- subOne: 123,
- },
- } as any,
- {
- optionOne: {
- subOne: 123,
- subTwo: 123,
- },
- } as any
- )
- ).to.deep.equal({
- optionOne: {
- subOne: 123,
- subTwo: 123,
- },
- });
- });
-
- it("should allow changing nulls", function () {
- expect(
- Config._merge_config_objects(
- {
- oidentd: null,
- } as any,
- {
- oidentd: "some path",
- } as any
- )
- ).to.deep.equal({
- oidentd: "some path",
- });
- });
-
- it("should allow changing nulls with objects", function () {
- expect(
- Config._merge_config_objects(
- {
- webirc: null,
- } as any,
- {
- webirc: {
- serverone: "password",
- servertwo: "password2",
- },
- } as any
- )
- ).to.deep.equal({
- webirc: {
- serverone: "password",
- servertwo: "password2",
- },
- });
- });
-
- it("should allow changing nulls with objects that has function", function () {
- const callbackFunction = () => ({});
-
- expect(
- Config._merge_config_objects(
- {
- webirc: null,
- } as any,
- {
- webirc: {
- servercb: callbackFunction,
- },
- } as any
- )
- ).to.deep.equal({
- webirc: {
- servercb: callbackFunction,
- },
- });
- });
-
- it("should keep new properties inside of objects", function () {
- expect(
- Config._merge_config_objects(
- {
- nestedOnce: {
- ip: "default",
- },
- nestedTwice: {
- thing: "default",
- nested: {
- otherThing: "also default",
- newThing: "but also this",
- },
- },
- } as any,
- {
- nestedOnce: {},
- nestedTwice: {
- nested: {
- otherThing: "overridden",
- },
- },
- } as any
- )
- ).to.deep.equal({
- nestedOnce: {
- ip: "default",
- },
- nestedTwice: {
- thing: "default",
- nested: {
- otherThing: "overridden",
- newThing: "but also this",
- },
- },
- });
- });
-
- it("should not merge arrays", function () {
- expect(
- Config._merge_config_objects(
- {
- test: ["sqlite", "text"],
- } as any,
- {
- test: ["sqlite"],
- } as any
- )
- ).to.deep.equal({
- test: ["sqlite"],
- });
-
- expect(
- Config._merge_config_objects(
- {
- test: ["sqlite", "text"],
- } as any,
- {
- test: [],
- } as any
- )
- ).to.deep.equal({
- test: [],
- });
- });
-
- it("should change order in arrays", function () {
- expect(
- Config._merge_config_objects(
- {
- test: ["sqlite", "text"],
- } as any,
- {
- test: ["text", "sqlite"],
- } as any
- )
- ).to.deep.equal({
- test: ["text", "sqlite"],
- });
- });
-
- it("should only merge same type", function () {
- const logWarnStub = sinon.stub(log, "warn");
-
- expect(
- Config._merge_config_objects(
- {
- shouldBeObject: {
- thing: "yes",
- },
- } as any,
- {
- shouldBeObject: "bad type",
- } as any
- )
- ).to.deep.equal({
- shouldBeObject: {
- thing: "yes",
- },
- });
-
- expect(
- Config._merge_config_objects(
- {
- shouldBeString: "string",
- } as any,
- {
- shouldBeString: 1234567,
- } as any
- )
- ).to.deep.equal({
- shouldBeString: "string",
- });
-
- logWarnStub.restore();
- });
-});
diff --git a/test/tests/nickhighlights.js b/test/tests/nickhighlights.js
new file mode 100644
index 00000000..9ef9f36b
--- /dev/null
+++ b/test/tests/nickhighlights.js
@@ -0,0 +1,63 @@
+"use strict";
+
+var expect = require("chai").expect;
+
+var Network = require("../../src/models/network");
+
+var network = new Network({name: "networkName"});
+
+describe("Nickname highlights", function() {
+ it("should NOT highlight nickname", function() {
+ network.setNick("lounge-bot");
+
+ expect("").to.not.match(network.highlightRegex);
+ expect(" ").to.not.match(network.highlightRegex);
+ expect("completely unrelated sentence").to.not.match(network.highlightRegex);
+ expect("foobarlounge-bot").to.not.match(network.highlightRegex);
+ expect("lounge-botfoobar").to.not.match(network.highlightRegex);
+ expect("\x03123lounge-bot").to.not.match(network.highlightRegex);
+ expect("lo\x0312unge-bot").to.not.match(network.highlightRegex);
+ expect("123lounge-bot").to.not.match(network.highlightRegex);
+ expect("lounge-botz").to.not.match(network.highlightRegex);
+ expect("lounge-bot123").to.not.match(network.highlightRegex);
+ expect("lounge- bot").to.not.match(network.highlightRegex);
+ expect("lounge_bot").to.not.match(network.highlightRegex);
+ expect("lounge- bot").to.not.match(network.highlightRegex);
+ expect("Alounge-bot").to.not.match(network.highlightRegex);
+ expect("lounge-botW").to.not.match(network.highlightRegex);
+ });
+
+ it("should highlight nickname", function() {
+ network.setNick("lounge-bot");
+
+ expect("lounge-bot").to.match(network.highlightRegex);
+ expect("LoUnge-Bot").to.match(network.highlightRegex);
+ expect("LoUnge-Bot:hello").to.match(network.highlightRegex);
+ expect("lounge-bot, hello").to.match(network.highlightRegex);
+ expect("lounge-bot: hello").to.match(network.highlightRegex);
+ expect("lounge-bot hello").to.match(network.highlightRegex);
+ expect("\x0312lounge-bot").to.match(network.highlightRegex);
+ expect("lounge-bot\x0312 test").to.match(network.highlightRegex);
+ expect("|lounge-bot").to.match(network.highlightRegex);
+ expect("www.lounge-bot.example.com").to.match(network.highlightRegex);
+ expect(" lounge-bot").to.match(network.highlightRegex);
+ expect("@lounge-bot").to.match(network.highlightRegex);
+ expect("+lounge-bot").to.match(network.highlightRegex);
+ expect("lounge-bot_, hey").to.match(network.highlightRegex);
+ expect("lounge-bot-, hey").to.match(network.highlightRegex);
+ expect("lounge-bot|sleep, hey").to.match(network.highlightRegex);
+ expect("LOUNGE-bot|sleep, hey").to.match(network.highlightRegex);
+ });
+
+ it("changing name should update regex", function() {
+ network.setNick("lounge-bot");
+
+ expect("lounge-bot, hello").to.match(network.highlightRegex);
+ expect("cool_person, hello").to.not.match(network.highlightRegex);
+
+ network.setNick("cool_person");
+
+ expect("lounge-bot, hello").to.not.match(network.highlightRegex);
+ expect("cool_person, hello").to.match(network.highlightRegex);
+ });
+});
diff --git a/test/tests/nickhighlights.ts b/test/tests/nickhighlights.ts
deleted file mode 100644
index dae265bc..00000000
--- a/test/tests/nickhighlights.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import {expect} from "chai";
-
-import Network from "../../server/models/network";
-
-const network = new Network({name: "networkName"});
-
-describe("Nickname highlights", function () {
- it("should NOT highlight nickname", function () {
- network.setNick("lounge-bot");
-
- expect("").to.not.match(network.highlightRegex as any);
- expect(" ").to.not.match(network.highlightRegex as any);
- expect("completely unrelated sentence").to.not.match(network.highlightRegex as any);
- expect("foobarlounge-bot").to.not.match(network.highlightRegex as any);
- expect("lounge-botfoobar").to.not.match(network.highlightRegex as any);
- expect("\x03123lounge-bot").to.not.match(network.highlightRegex as any);
- expect("lo\x0312unge-bot").to.not.match(network.highlightRegex as any);
- expect("123lounge-bot").to.not.match(network.highlightRegex as any);
- expect("lounge-botz").to.not.match(network.highlightRegex as any);
- expect("lounge-bot123").to.not.match(network.highlightRegex as any);
- expect("lounge- bot").to.not.match(network.highlightRegex as any);
- expect("lounge_bot").to.not.match(network.highlightRegex as any);
- expect("lounge- bot").to.not.match(network.highlightRegex as any);
- expect("Alounge-bot").to.not.match(network.highlightRegex as any);
- expect("lounge-botW").to.not.match(network.highlightRegex as any);
- });
-
- it("should highlight nickname", function () {
- network.setNick("lounge-bot");
-
- expect("lounge-bot").to.match(network.highlightRegex as any);
- expect("LoUnge-Bot").to.match(network.highlightRegex as any);
- expect("LoUnge-Bot:hello").to.match(network.highlightRegex as any);
- expect("lounge-bot, hello").to.match(network.highlightRegex as any);
- expect("lounge-bot: hello").to.match(network.highlightRegex as any);
- expect("lounge-bot hello").to.match(network.highlightRegex as any);
- expect("\x0312lounge-bot").to.match(network.highlightRegex as any);
- expect("lounge-bot\x0312 test").to.match(network.highlightRegex as any);
- expect("|lounge-bot").to.match(network.highlightRegex as any);
- expect("www.lounge-bot.example.com").to.match(network.highlightRegex as any);
- expect(" lounge-bot").to.match(network.highlightRegex as any);
- expect("@lounge-bot").to.match(network.highlightRegex as any);
- expect("+lounge-bot").to.match(network.highlightRegex as any);
- expect("lounge-bot_, hey").to.match(network.highlightRegex as any);
- expect("lounge-bot-, hey").to.match(network.highlightRegex as any);
- expect("lounge-bot|sleep, hey").to.match(network.highlightRegex as any);
- expect("LOUNGE-bot|sleep, hey").to.match(network.highlightRegex as any);
- });
-
- it("changing name should update regex", function () {
- network.setNick("lounge-bot");
-
- expect("lounge-bot, hello").to.match(network.highlightRegex as any);
- expect("cool_person, hello").to.not.match(network.highlightRegex as any);
-
- network.setNick("cool_person");
-
- expect("lounge-bot, hello").to.not.match(network.highlightRegex as any);
- expect("cool_person, hello").to.match(network.highlightRegex as any);
- });
-});
diff --git a/test/tests/passwords.ts b/test/tests/passwords.ts
deleted file mode 100644
index 62932811..00000000
--- a/test/tests/passwords.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import {expect} from "chai";
-import Helper from "../../server/helper";
-
-describe("Client passwords", function () {
- this.slow(1500);
-
- const inputPassword = "my$Super@Cool Password";
-
- it("hashed password should match", function () {
- // Generated with third party tool to test implementation
- const comparedPassword = Helper.password.compare(
- inputPassword,
- "$2a$11$zrPPcfZ091WNfs6QrRHtQeUitlgrJcecfZhxOFiQs0FWw7TN3Q1oS"
- );
-
- return comparedPassword.then((result) => {
- expect(result).to.be.true;
- });
- });
-
- it("wrong hashed password should not match", function () {
- // Compare against a fake hash
- const comparedPassword = Helper.password.compare(
- inputPassword,
- "$2a$11$zrPPcfZ091WRONGPASSWORDitlgrJcecfZhxOFiQs0FWw7TN3Q1oS"
- );
-
- return comparedPassword.then((result) => {
- expect(result).to.be.false;
- });
- });
-
- it("freshly hashed password should match", function () {
- const hashedPassword = Helper.password.hash(inputPassword);
- const comparedPassword = Helper.password.compare(inputPassword, hashedPassword);
-
- return comparedPassword.then((result) => {
- expect(result).to.be.true;
- });
- });
-
- it("shout passwords should be marked as old", function () {
- expect(
- Helper.password.requiresUpdate(
- "$2a$08$K4l.hteJcCP9D1G5PANzYuBGvdqhUSUDOLQLU.xeRxTbvtp01KINm"
- )
- ).to.be.true;
- expect(
- Helper.password.requiresUpdate(
- "$2a$11$zrPPcfZ091WNfs6QrRHtQeUitlgrJcecfZhxOFiQs0FWw7TN3Q1oS"
- )
- ).to.be.false;
- });
-});
diff --git a/test/tests/textLogFolder.ts b/test/tests/textLogFolder.ts
deleted file mode 100644
index ea236e1a..00000000
--- a/test/tests/textLogFolder.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import {expect} from "chai";
-import Network from "../../server/models/network";
-import TextFileMessageStorage from "../../server/plugins/messageStorage/text";
-
-describe("TextFileMessageStorage", function () {
- it("should combine network name and uuid into a safe name", function () {
- expect(
- TextFileMessageStorage.getNetworkFolderName({
- name: "Freenode",
- uuid: "f9042ec9-4016-45e0-a8a8-d378fb252628",
- } as Network)
- ).to.equal("freenode-4016-45e0-a8a8-d378fb252628");
- });
-
- it("network name should be cleaned up and lowercased", function () {
- expect(
- TextFileMessageStorage.getNetworkFolderName({
- name: '@ TeSt ../..\\<>:"/\\|?*',
- uuid: "f9042ec9-4016-45e0-a8a8-d378fb252628",
- } as Network)
- ).to.equal("@-test-.._..--45e0-a8a8-d378fb252628");
- });
-
- it("folder name may contain two dashes if on boundary", function () {
- expect(
- TextFileMessageStorage.getNetworkFolderName({
- name: "Freenod",
- uuid: "f9042ec9-4016-45e0-a8a8-d378fb252628",
- } as Network)
- ).to.equal("freenod--4016-45e0-a8a8-d378fb252628");
- });
-
- it("should limit network name length", function () {
- expect(
- TextFileMessageStorage.getNetworkFolderName({
- name: "This network name is longer than the uuid itself but it should be limited",
- uuid: "f9042ec9-4016-45e0-a8a8-d378fb252628",
- } as Network)
- ).to.equal("this-network-name-is-lo-d378fb252628");
- });
-});
diff --git a/test/tsconfig.json b/test/tsconfig.json
deleted file mode 100644
index b4485495..00000000
--- a/test/tsconfig.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "extends": "../tsconfig.base.json" /* Path to base configuration file to inherit from. Requires TypeScript version 2.1 or later. */,
- "include": [
- "**/*",
- "../client",
- "../server",
- "../shared"
- ] /* Specifies a list of glob patterns that match files to be included in compilation. If no 'files' or 'include' property is present in a tsconfig.json, the compiler defaults to including all files in the containing directory and subdirectories except those specified by 'exclude'. Requires TypeScript version 2.0 or later. */,
- "files": [
- "../babel.config.cjs",
- "../server/helper.ts",
- "../server/index.d.ts",
- "../package.json"
- ] /* If no 'files' or 'include' property is present in a tsconfig.json, the compiler defaults to including all files in the containing directory and subdirectories except those specified by 'exclude'. When a 'files' property is specified, only those files and those specified by 'include' are included. */,
- "ts-node": {
- "files": true
- },
- "compilerOptions": {
- "jsx": "preserve" /* Specify what JSX code is generated. */,
-
- // TODO: Remove eventually
- "noImplicitAny": false /*Enable error reporting for expressions and declarations with an implied any type. See more: https://www.typescriptlang.org/tsconfig#noImplicitAny */
- } /* Instructs the TypeScript compiler how to compile .ts files. */
-}
diff --git a/test/util.js b/test/util.js
new file mode 100644
index 00000000..58edddd7
--- /dev/null
+++ b/test/util.js
@@ -0,0 +1,42 @@
+var EventEmitter = require("events").EventEmitter;
+var util = require("util");
+var _ = require("lodash");
+var express = require("express");
+var Network = require("../src/models/network");
+var Chan = require("../src/models/chan");
+
+function MockClient(opts) {
+ this.user = {nick: "test-user"};
+
+ for (var k in opts) {
+ this[k] = opts[k];
+ }
+}
+util.inherits(MockClient, EventEmitter);
+
+MockClient.prototype.createMessage = function(opts) {
+ var message = _.extend({
+ message: "dummy message",
+ nick: "test-user",
+ target: "#test-channel"
+ }, opts);
+
+ this.emit("privmsg", message);
+};
+
+module.exports = {
+ createClient: function() {
+ return new MockClient();
+ },
+ createNetwork: function() {
+ return new Network({
+ host: "example.com",
+ channels: [new Chan({
+ name: "#test-channel"
+ })]
+ });
+ },
+ createWebserver: function() {
+ return express();
+ }
+};
diff --git a/test/util.ts b/test/util.ts
deleted file mode 100644
index 32b128c0..00000000
--- a/test/util.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import _ from "lodash";
-import express from "express";
-import Network from "../server/models/network";
-import Chan from "../server/models/chan";
-import {EventEmitter} from "events";
-import {Message} from "../server/models/msg";
-
-class MockClient extends EventEmitter {
- config: {
- browser: any;
- };
-
- constructor() {
- super();
-
- this.config = {
- browser: {},
- };
- }
-
- createMessage(opts: any) {
- const message = _.extend(
- {
- text: "dummy message",
- nick: "test-user",
- target: "#test-channel",
- previews: [],
- },
- opts
- ) as Message;
-
- return message;
- }
-}
-
-function sanitizeLog(callback: (log: string) => void) {
- return function (...args: string[]) {
- // Concats and removes ANSI colors. See https://stackoverflow.com/a/29497680
- const stdout = args
- .join(" ")
- .replace(
- /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,
- ""
- );
-
- callback(stdout + "\n");
- };
-}
-
-export default {
- createClient() {
- return new MockClient();
- },
- createNetwork() {
- return new Network({
- host: "example.com",
- channels: [
- new Chan({
- name: "#test-channel",
- }),
- ],
- });
- },
- createWebserver() {
- return express();
- },
- sanitizeLog,
- isRunningOnCI() {
- return process.env.CI || process.env.GITHUB_ACTIONS;
- },
-};
diff --git a/tsconfig.base.json b/tsconfig.base.json
deleted file mode 100644
index 4fffdfd9..00000000
--- a/tsconfig.base.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
- "compilerOptions": {
- /* Visit https://aka.ms/tsconfig.json to read more about this file */
-
- /* Projects */
- // "incremental": true, /* Enable incremental compilation */
- "composite": true /* Enable constraints that allow a TypeScript project to be used with project references. */,
- // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */
- // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */
- // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
- // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
-
- /* Language and Environment */
- "target": "esnext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
- // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
- // "jsx": "preserve", /* Specify what JSX code is generated. */
- // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
- // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
- // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */
- // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
- // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */
- // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */
- // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
- // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
-
- /* Modules */
- "module": "commonjs" /* Specify what module code is generated. */,
- "rootDir": "./" /* Specify the root folder within your source files. */,
- "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */,
- // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
- // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
- // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
- // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */
- // "types": [], /* Specify type package names to be included without being referenced in a source file. */
- // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
- "resolveJsonModule": true /* Enable importing .json files */,
- // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */
-
- /* JavaScript Support */
- "allowJs": true /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */,
- "checkJs": true /* Enable error reporting in type-checked JavaScript files. */,
- // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */
-
- /* Emit */
- "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */,
- // "declarationMap": true, /* Create sourcemaps for d.ts files. */
- // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
- // "sourceMap": true, /* Create source map files for emitted JavaScript files. */
- // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
- /* outDir is necessary because otherwise the built output for files like babel.config.cjs would overwrite the input. */
- "outDir": "./dist" /* Specify an output folder for all emitted files. */,
- // "removeComments": true, /* Disable emitting comments. */
- // "noEmit": true, /* Disable emitting files from a compilation. */
- // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
- // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */
- // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
- // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
- // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
- // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
- // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
- // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
- // "newLine": "crlf", /* Set the newline character for emitting files. */
- // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */
- // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */
- // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
- // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */
- // "declarationDir": "./", /* Specify the output directory for generated declaration files. */
- // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
-
- /* Interop Constraints */
- // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
- "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */,
- "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */,
- // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
- "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
-
- /* Type Checking */
- "strict": true /* Enable all strict type-checking options. */,
- // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */
- // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */
- // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
- // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */
- // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
- // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */
- // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */
- // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
- // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */
- // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */
- // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
- // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
- // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
- // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
- // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
- // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */
- // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
- // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
-
- /* Completeness */
- // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
- "skipLibCheck": true /* Skip type checking all .d.ts files. */
- },
- "exclude": ["./dist"]
-}
diff --git a/tsconfig.json b/tsconfig.json
deleted file mode 100644
index bfd7b57a..00000000
--- a/tsconfig.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "extends": "./tsconfig.base.json" /* Path to base configuration file to inherit from. Requires TypeScript version 2.1 or later. */,
- "files": [
- "./webpack.config.ts",
- "./babel.config.cjs"
- ] /* If no 'files' or 'include' property is present in a tsconfig.json, the compiler defaults to including all files in the containing directory and subdirectories except those specified by 'exclude'. When a 'files' property is specified, only those files and those specified by 'include' are included. */,
- // "exclude": [],
- "references": [
- {"path": "./client"},
- {"path": "./server"},
- {"path": "./shared"}
- ] /* Referenced projects. Requires TypeScript version 3.0 or later. */,
- "compilerOptions": {
- // TODO: Remove eventually
- "noImplicitAny": false /*Enable error reporting for expressions and declarations with an implied any type. See more: https://www.typescriptlang.org/tsconfig#noImplicitAny */
- } /* Instructs the TypeScript compiler how to compile .ts files. */
-}
diff --git a/volar.config.js b/volar.config.js
deleted file mode 100644
index 3afec77f..00000000
--- a/volar.config.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/** @type {import('@volar-plugins/prettier')} */
-const {volarPrettierPlugin} = require("@volar-plugins/prettier");
-
-module.exports = {
- plugins: [
- volarPrettierPlugin({
- languages: ["html", "css", "scss", "typescript", "javascript"],
- html: {
- breakContentsFromTags: true,
- },
- useVscodeIndentation: true,
- }),
- ],
-};
diff --git a/webpack.config.ts b/webpack.config.ts
deleted file mode 100644
index 02a7ca54..00000000
--- a/webpack.config.ts
+++ /dev/null
@@ -1,218 +0,0 @@
-import * as webpack from "webpack";
-import * as path from "path";
-import CopyPlugin from "copy-webpack-plugin";
-import ForkTsCheckerWebpackPlugin from "fork-ts-checker-webpack-plugin";
-import MiniCssExtractPlugin from "mini-css-extract-plugin";
-import {VueLoaderPlugin} from "vue-loader";
-import babelConfig from "./babel.config.cjs";
-import Helper from "./server/helper";
-
-const tsCheckerPlugin = new ForkTsCheckerWebpackPlugin({
- typescript: {
- diagnosticOptions: {
- semantic: true,
- syntactic: true,
- },
- build: true,
- },
-});
-
-const vueLoaderPlugin = new VueLoaderPlugin();
-
-const miniCssExtractPlugin = new MiniCssExtractPlugin({
- filename: "css/style.css",
-});
-
-const isProduction = process.env.NODE_ENV === "production";
-const config: webpack.Configuration = {
- mode: isProduction ? "production" : "development",
- entry: {
- "js/bundle.js": [path.resolve(__dirname, "client/js/vue.ts")],
- },
- devtool: "source-map",
- output: {
- clean: true, // Clean the output directory before emit.
- path: path.resolve(__dirname, "public"),
- filename: "[name]",
- publicPath: "/",
- },
- performance: {
- hints: false,
- },
- resolve: {
- extensions: [".ts", ".js", ".vue"],
- },
- module: {
- rules: [
- {
- test: /\.vue$/,
- use: {
- loader: "vue-loader",
- options: {
- compilerOptions: {
- preserveWhitespace: false,
- },
- appendTsSuffixTo: [/\.vue$/],
- },
- },
- },
- {
- test: /\.ts$/i,
- include: [path.resolve(__dirname, "client"), path.resolve(__dirname, "shared")],
- exclude: path.resolve(__dirname, "node_modules"),
- use: {
- loader: "babel-loader",
- options: babelConfig,
- },
- },
- {
- test: /\.css$/,
- use: [
- {
- loader: MiniCssExtractPlugin.loader,
- options: {
- esModule: false,
- },
- },
- {
- loader: "css-loader",
- options: {
- url: false,
- importLoaders: 1,
- sourceMap: true,
- },
- },
- {
- loader: "postcss-loader",
- options: {
- sourceMap: true,
- },
- },
- ],
- },
- ],
- },
- optimization: {
- splitChunks: {
- cacheGroups: {
- commons: {
- test: /[\\/]node_modules[\\/]/,
- name: "js/bundle.vendor.js",
- chunks: "all",
- },
- },
- },
- },
- externals: {
- json3: "JSON", // socket.io uses json3.js, but we do not target any browsers that need it
- },
- plugins: [
- tsCheckerPlugin,
- vueLoaderPlugin,
- new webpack.DefinePlugin({
- __VUE_PROD_DEVTOOLS__: false,
- __VUE_OPTIONS_API__: false,
- }),
- miniCssExtractPlugin,
- new CopyPlugin({
- patterns: [
- {
- from: path
- .resolve(
- __dirname,
- "node_modules/@fortawesome/fontawesome-free/webfonts/fa-solid-900.woff*"
- )
- .replace(/\\/g, "/"),
- to: "fonts/[name][ext]",
- },
- {
- from: path.resolve(__dirname, "./client/js/loading-error-handlers.js"),
- to: "js/[name][ext]",
- },
- {
- from: path.resolve(__dirname, "./client/*").replace(/\\/g, "/"),
- to: "[name][ext]",
- globOptions: {
- ignore: [
- "**/index.html.tpl",
- "**/service-worker.js",
- "**/*.d.ts",
- "**/tsconfig.json",
- ],
- },
- },
- {
- from: path.resolve(__dirname, "./client/service-worker.js"),
- to: "[name][ext]",
- transform(content) {
- return content
- .toString()
- .replace(
- "__HASH__",
- isProduction ? Helper.getVersionCacheBust() : "dev"
- );
- },
- },
- {
- from: path.resolve(__dirname, "./client/audio/*").replace(/\\/g, "/"),
- to: "audio/[name][ext]",
- },
- {
- from: path.resolve(__dirname, "./client/img/*").replace(/\\/g, "/"),
- to: "img/[name][ext]",
- },
- {
- from: path.resolve(__dirname, "./client/themes/*").replace(/\\/g, "/"),
- to: "themes/[name][ext]",
- },
- ],
- }),
- // socket.io uses debug, we don't need it
- new webpack.NormalModuleReplacementPlugin(
- /debug/,
- path.resolve(__dirname, "scripts/noop.js")
- ),
- ],
-};
-
-export default (env: any, argv: any) => {
- if (argv.mode === "development") {
- config.target = "node";
- config.devtool = "eval";
- config.stats = "errors-only";
- config.output!.path = path.resolve(__dirname, "test/public");
- config.entry!["testclient.js"] = [path.resolve(__dirname, "test/client/index.ts")];
-
- // Add the istanbul plugin to babel-loader options
- for (const rule of config.module!.rules!) {
- // @ts-expect-error Property 'use' does not exist on type 'RuleSetRule | "..."'.
- if (rule.use.loader === "babel-loader") {
- // @ts-expect-error Property 'use' does not exist on type 'RuleSetRule | "..."'.
- rule.use.options.plugins = ["istanbul"];
- }
- }
-
- // `optimization.splitChunks` is incompatible with a `target` of `node`. See:
- // - https://github.com/zinserjan/mocha-webpack/issues/84
- // - https://github.com/webpack/webpack/issues/6727#issuecomment-372589122
- config.optimization!.splitChunks = false;
-
- // Disable plugins like copy files, it is not required
- config.plugins = [
- tsCheckerPlugin,
- vueLoaderPlugin,
- miniCssExtractPlugin,
- // Client tests that require Vue may end up requireing socket.io
- new webpack.NormalModuleReplacementPlugin(
- /js(\/|\\)socket\.js/,
- path.resolve(__dirname, "scripts/noop.js")
- ),
- ];
- }
-
- if (argv?.mode === "production") {
- // ...
- }
-
- return config;
-};
diff --git a/yarn.lock b/yarn.lock
deleted file mode 100644
index e4c3d2c5..00000000
--- a/yarn.lock
+++ /dev/null
@@ -1,9413 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@ampproject/remapping@^2.1.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
- integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
- dependencies:
- "@jridgewell/gen-mapping" "^0.1.0"
- "@jridgewell/trace-mapping" "^0.3.9"
-
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
- integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
- dependencies:
- "@babel/highlight" "^7.18.6"
-
-"@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5":
- version "7.23.5"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244"
- integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==
- dependencies:
- "@babel/highlight" "^7.23.4"
- chalk "^2.4.2"
-
-"@babel/compat-data@^7.17.10", "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8":
- version "7.18.8"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d"
- integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==
-
-"@babel/core@7.17.10":
- version "7.17.10"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05"
- integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA==
- dependencies:
- "@ampproject/remapping" "^2.1.0"
- "@babel/code-frame" "^7.16.7"
- "@babel/generator" "^7.17.10"
- "@babel/helper-compilation-targets" "^7.17.10"
- "@babel/helper-module-transforms" "^7.17.7"
- "@babel/helpers" "^7.17.9"
- "@babel/parser" "^7.17.10"
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.17.10"
- "@babel/types" "^7.17.10"
- convert-source-map "^1.7.0"
- debug "^4.1.0"
- gensync "^1.0.0-beta.2"
- json5 "^2.2.1"
- semver "^6.3.0"
-
-"@babel/core@^7.12.3", "@babel/core@^7.7.5":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59"
- integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==
- dependencies:
- "@ampproject/remapping" "^2.1.0"
- "@babel/code-frame" "^7.18.6"
- "@babel/generator" "^7.18.9"
- "@babel/helper-compilation-targets" "^7.18.9"
- "@babel/helper-module-transforms" "^7.18.9"
- "@babel/helpers" "^7.18.9"
- "@babel/parser" "^7.18.9"
- "@babel/template" "^7.18.6"
- "@babel/traverse" "^7.18.9"
- "@babel/types" "^7.18.9"
- convert-source-map "^1.7.0"
- debug "^4.1.0"
- gensync "^1.0.0-beta.2"
- json5 "^2.2.1"
- semver "^6.3.0"
-
-"@babel/generator@^7.17.10", "@babel/generator@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5"
- integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==
- dependencies:
- "@babel/types" "^7.18.9"
- "@jridgewell/gen-mapping" "^0.3.2"
- jsesc "^2.5.1"
-
-"@babel/generator@^7.23.6":
- version "7.23.6"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e"
- integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==
- dependencies:
- "@babel/types" "^7.23.6"
- "@jridgewell/gen-mapping" "^0.3.2"
- "@jridgewell/trace-mapping" "^0.3.17"
- jsesc "^2.5.1"
-
-"@babel/helper-annotate-as-pure@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb"
- integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==
- dependencies:
- "@babel/types" "^7.18.6"
-
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb"
- integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==
- dependencies:
- "@babel/helper-explode-assignable-expression" "^7.18.6"
- "@babel/types" "^7.18.9"
-
-"@babel/helper-compilation-targets@^7.17.10", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf"
- integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==
- dependencies:
- "@babel/compat-data" "^7.18.8"
- "@babel/helper-validator-option" "^7.18.6"
- browserslist "^4.20.2"
- semver "^6.3.0"
-
-"@babel/helper-create-class-features-plugin@^7.18.6":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce"
- integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.18.6"
- "@babel/helper-environment-visitor" "^7.18.9"
- "@babel/helper-function-name" "^7.18.9"
- "@babel/helper-member-expression-to-functions" "^7.18.9"
- "@babel/helper-optimise-call-expression" "^7.18.6"
- "@babel/helper-replace-supers" "^7.18.9"
- "@babel/helper-split-export-declaration" "^7.18.6"
-
-"@babel/helper-create-regexp-features-plugin@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c"
- integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.18.6"
- regexpu-core "^5.1.0"
-
-"@babel/helper-define-polyfill-provider@^0.3.1", "@babel/helper-define-polyfill-provider@^0.3.2":
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz#bd10d0aca18e8ce012755395b05a79f45eca5073"
- integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==
- dependencies:
- "@babel/helper-compilation-targets" "^7.17.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- debug "^4.1.1"
- lodash.debounce "^4.0.8"
- resolve "^1.14.2"
- semver "^6.1.2"
-
-"@babel/helper-environment-visitor@^7.18.6", "@babel/helper-environment-visitor@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
- integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
-
-"@babel/helper-environment-visitor@^7.22.20":
- version "7.22.20"
- resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
- integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
-
-"@babel/helper-explode-assignable-expression@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096"
- integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==
- dependencies:
- "@babel/types" "^7.18.6"
-
-"@babel/helper-function-name@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0"
- integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==
- dependencies:
- "@babel/template" "^7.18.6"
- "@babel/types" "^7.18.9"
-
-"@babel/helper-function-name@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
- integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
- dependencies:
- "@babel/template" "^7.22.15"
- "@babel/types" "^7.23.0"
-
-"@babel/helper-hoist-variables@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
- integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==
- dependencies:
- "@babel/types" "^7.18.6"
-
-"@babel/helper-hoist-variables@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
- integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
- dependencies:
- "@babel/types" "^7.22.5"
-
-"@babel/helper-member-expression-to-functions@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815"
- integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==
- dependencies:
- "@babel/types" "^7.18.9"
-
-"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
- integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
- dependencies:
- "@babel/types" "^7.18.6"
-
-"@babel/helper-module-transforms@^7.17.7", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712"
- integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==
- dependencies:
- "@babel/helper-environment-visitor" "^7.18.9"
- "@babel/helper-module-imports" "^7.18.6"
- "@babel/helper-simple-access" "^7.18.6"
- "@babel/helper-split-export-declaration" "^7.18.6"
- "@babel/helper-validator-identifier" "^7.18.6"
- "@babel/template" "^7.18.6"
- "@babel/traverse" "^7.18.9"
- "@babel/types" "^7.18.9"
-
-"@babel/helper-optimise-call-expression@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe"
- integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==
- dependencies:
- "@babel/types" "^7.18.6"
-
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f"
- integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==
-
-"@babel/helper-remap-async-to-generator@^7.18.6":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519"
- integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.18.6"
- "@babel/helper-environment-visitor" "^7.18.9"
- "@babel/helper-wrap-function" "^7.18.9"
- "@babel/types" "^7.18.9"
-
-"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6"
- integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==
- dependencies:
- "@babel/helper-environment-visitor" "^7.18.9"
- "@babel/helper-member-expression-to-functions" "^7.18.9"
- "@babel/helper-optimise-call-expression" "^7.18.6"
- "@babel/traverse" "^7.18.9"
- "@babel/types" "^7.18.9"
-
-"@babel/helper-simple-access@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea"
- integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==
- dependencies:
- "@babel/types" "^7.18.6"
-
-"@babel/helper-skip-transparent-expression-wrappers@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818"
- integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==
- dependencies:
- "@babel/types" "^7.18.9"
-
-"@babel/helper-split-export-declaration@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075"
- integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==
- dependencies:
- "@babel/types" "^7.18.6"
-
-"@babel/helper-split-export-declaration@^7.22.6":
- version "7.22.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
- integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
- dependencies:
- "@babel/types" "^7.22.5"
-
-"@babel/helper-string-parser@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83"
- integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==
-
-"@babel/helper-validator-identifier@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076"
- integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==
-
-"@babel/helper-validator-identifier@^7.22.20":
- version "7.22.20"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
- integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
-
-"@babel/helper-validator-option@^7.16.7", "@babel/helper-validator-option@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8"
- integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==
-
-"@babel/helper-wrap-function@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz#ae1feddc6ebbaa2fd79346b77821c3bd73a39646"
- integrity sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==
- dependencies:
- "@babel/helper-function-name" "^7.18.9"
- "@babel/template" "^7.18.6"
- "@babel/traverse" "^7.18.9"
- "@babel/types" "^7.18.9"
-
-"@babel/helpers@^7.17.9", "@babel/helpers@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9"
- integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==
- dependencies:
- "@babel/template" "^7.18.6"
- "@babel/traverse" "^7.18.9"
- "@babel/types" "^7.18.9"
-
-"@babel/highlight@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
- integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
- dependencies:
- "@babel/helper-validator-identifier" "^7.18.6"
- chalk "^2.0.0"
- js-tokens "^4.0.0"
-
-"@babel/highlight@^7.23.4":
- version "7.23.4"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b"
- integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==
- dependencies:
- "@babel/helper-validator-identifier" "^7.22.20"
- chalk "^2.4.2"
- js-tokens "^4.0.0"
-
-"@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.17.10", "@babel/parser@^7.18.6", "@babel/parser@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539"
- integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==
-
-"@babel/parser@^7.22.15", "@babel/parser@^7.23.6":
- version "7.23.6"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b"
- integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==
-
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2"
- integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50"
- integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
- "@babel/plugin-proposal-optional-chaining" "^7.18.9"
-
-"@babel/plugin-proposal-async-generator-functions@^7.16.8":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz#aedac81e6fc12bb643374656dd5f2605bf743d17"
- integrity sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==
- dependencies:
- "@babel/helper-environment-visitor" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/helper-remap-async-to-generator" "^7.18.6"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
-
-"@babel/plugin-proposal-class-properties@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
- integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-proposal-class-static-block@^7.17.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020"
- integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
-
-"@babel/plugin-proposal-dynamic-import@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94"
- integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
-
-"@babel/plugin-proposal-export-namespace-from@^7.16.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203"
- integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-
-"@babel/plugin-proposal-json-strings@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b"
- integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
-
-"@babel/plugin-proposal-logical-assignment-operators@^7.16.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23"
- integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
- integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-
-"@babel/plugin-proposal-numeric-separator@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75"
- integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
-
-"@babel/plugin-proposal-object-rest-spread@^7.17.3":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7"
- integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==
- dependencies:
- "@babel/compat-data" "^7.18.8"
- "@babel/helper-compilation-targets" "^7.18.9"
- "@babel/helper-plugin-utils" "^7.18.9"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.18.8"
-
-"@babel/plugin-proposal-optional-catch-binding@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb"
- integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-
-"@babel/plugin-proposal-optional-chaining@^7.16.7", "@babel/plugin-proposal-optional-chaining@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993"
- integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
-
-"@babel/plugin-proposal-private-methods@^7.16.11":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea"
- integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-proposal-private-property-in-object@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503"
- integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.18.6"
- "@babel/helper-create-class-features-plugin" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-
-"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e"
- integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-syntax-async-generators@^7.8.4":
- version "7.8.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
- integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-class-properties@^7.12.13":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
- integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
-
-"@babel/plugin-syntax-class-static-block@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
- integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
-"@babel/plugin-syntax-dynamic-import@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
- integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-export-namespace-from@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
- integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-syntax-json-strings@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
- integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
- integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
- dependencies:
- "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
- integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-numeric-separator@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
- integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
- dependencies:
- "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-object-rest-spread@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
- integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
- integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-optional-chaining@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
- integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-private-property-in-object@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
- integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
-"@babel/plugin-syntax-top-level-await@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
- integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
-"@babel/plugin-syntax-typescript@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285"
- integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-arrow-functions@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe"
- integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-async-to-generator@^7.16.8":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615"
- integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==
- dependencies:
- "@babel/helper-module-imports" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/helper-remap-async-to-generator" "^7.18.6"
-
-"@babel/plugin-transform-block-scoped-functions@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8"
- integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-block-scoping@^7.16.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d"
- integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
-
-"@babel/plugin-transform-classes@^7.16.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da"
- integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.18.6"
- "@babel/helper-environment-visitor" "^7.18.9"
- "@babel/helper-function-name" "^7.18.9"
- "@babel/helper-optimise-call-expression" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.9"
- "@babel/helper-replace-supers" "^7.18.9"
- "@babel/helper-split-export-declaration" "^7.18.6"
- globals "^11.1.0"
-
-"@babel/plugin-transform-computed-properties@^7.16.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e"
- integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
-
-"@babel/plugin-transform-destructuring@^7.17.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz#68906549c021cb231bee1db21d3b5b095f8ee292"
- integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
-
-"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8"
- integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-duplicate-keys@^7.16.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e"
- integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
-
-"@babel/plugin-transform-exponentiation-operator@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd"
- integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==
- dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-for-of@^7.16.7":
- version "7.18.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1"
- integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-function-name@^7.16.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0"
- integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==
- dependencies:
- "@babel/helper-compilation-targets" "^7.18.9"
- "@babel/helper-function-name" "^7.18.9"
- "@babel/helper-plugin-utils" "^7.18.9"
-
-"@babel/plugin-transform-literals@^7.16.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc"
- integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
-
-"@babel/plugin-transform-member-expression-literals@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e"
- integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-modules-amd@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21"
- integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==
- dependencies:
- "@babel/helper-module-transforms" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
- babel-plugin-dynamic-import-node "^2.3.3"
-
-"@babel/plugin-transform-modules-commonjs@^7.17.9":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883"
- integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==
- dependencies:
- "@babel/helper-module-transforms" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/helper-simple-access" "^7.18.6"
- babel-plugin-dynamic-import-node "^2.3.3"
-
-"@babel/plugin-transform-modules-systemjs@^7.17.8":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06"
- integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==
- dependencies:
- "@babel/helper-hoist-variables" "^7.18.6"
- "@babel/helper-module-transforms" "^7.18.9"
- "@babel/helper-plugin-utils" "^7.18.9"
- "@babel/helper-validator-identifier" "^7.18.6"
- babel-plugin-dynamic-import-node "^2.3.3"
-
-"@babel/plugin-transform-modules-umd@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9"
- integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==
- dependencies:
- "@babel/helper-module-transforms" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-named-capturing-groups-regex@^7.17.10":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d"
- integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-new-target@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8"
- integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-object-super@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c"
- integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/helper-replace-supers" "^7.18.6"
-
-"@babel/plugin-transform-parameters@^7.16.7", "@babel/plugin-transform-parameters@^7.18.8":
- version "7.18.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a"
- integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-property-literals@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3"
- integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-regenerator@^7.17.9":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73"
- integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- regenerator-transform "^0.15.0"
-
-"@babel/plugin-transform-reserved-words@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a"
- integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-runtime@7.18.2":
- version "7.18.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz#04637de1e45ae8847ff14b9beead09c33d34374d"
- integrity sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg==
- dependencies:
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.17.12"
- babel-plugin-polyfill-corejs2 "^0.3.0"
- babel-plugin-polyfill-corejs3 "^0.5.0"
- babel-plugin-polyfill-regenerator "^0.3.0"
- semver "^6.3.0"
-
-"@babel/plugin-transform-shorthand-properties@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9"
- integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-spread@^7.16.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664"
- integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
-
-"@babel/plugin-transform-sticky-regex@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc"
- integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-template-literals@^7.16.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e"
- integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
-
-"@babel/plugin-transform-typeof-symbol@^7.16.7":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0"
- integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.9"
-
-"@babel/plugin-transform-typescript@^7.18.6", "@babel/plugin-transform-typescript@^7.3.2":
- version "7.18.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.8.tgz#303feb7a920e650f2213ef37b36bbf327e6fa5a0"
- integrity sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/plugin-syntax-typescript" "^7.18.6"
-
-"@babel/plugin-transform-unicode-escapes@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz#0d01fb7fb2243ae1c033f65f6e3b4be78db75f27"
- integrity sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-unicode-regex@^7.16.7":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca"
- integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/preset-env@7.17.10":
- version "7.17.10"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.17.10.tgz#a81b093669e3eb6541bb81a23173c5963c5de69c"
- integrity sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==
- dependencies:
- "@babel/compat-data" "^7.17.10"
- "@babel/helper-compilation-targets" "^7.17.10"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-validator-option" "^7.16.7"
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7"
- "@babel/plugin-proposal-async-generator-functions" "^7.16.8"
- "@babel/plugin-proposal-class-properties" "^7.16.7"
- "@babel/plugin-proposal-class-static-block" "^7.17.6"
- "@babel/plugin-proposal-dynamic-import" "^7.16.7"
- "@babel/plugin-proposal-export-namespace-from" "^7.16.7"
- "@babel/plugin-proposal-json-strings" "^7.16.7"
- "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7"
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7"
- "@babel/plugin-proposal-numeric-separator" "^7.16.7"
- "@babel/plugin-proposal-object-rest-spread" "^7.17.3"
- "@babel/plugin-proposal-optional-catch-binding" "^7.16.7"
- "@babel/plugin-proposal-optional-chaining" "^7.16.7"
- "@babel/plugin-proposal-private-methods" "^7.16.11"
- "@babel/plugin-proposal-private-property-in-object" "^7.16.7"
- "@babel/plugin-proposal-unicode-property-regex" "^7.16.7"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
- "@babel/plugin-syntax-class-properties" "^7.12.13"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
- "@babel/plugin-syntax-top-level-await" "^7.14.5"
- "@babel/plugin-transform-arrow-functions" "^7.16.7"
- "@babel/plugin-transform-async-to-generator" "^7.16.8"
- "@babel/plugin-transform-block-scoped-functions" "^7.16.7"
- "@babel/plugin-transform-block-scoping" "^7.16.7"
- "@babel/plugin-transform-classes" "^7.16.7"
- "@babel/plugin-transform-computed-properties" "^7.16.7"
- "@babel/plugin-transform-destructuring" "^7.17.7"
- "@babel/plugin-transform-dotall-regex" "^7.16.7"
- "@babel/plugin-transform-duplicate-keys" "^7.16.7"
- "@babel/plugin-transform-exponentiation-operator" "^7.16.7"
- "@babel/plugin-transform-for-of" "^7.16.7"
- "@babel/plugin-transform-function-name" "^7.16.7"
- "@babel/plugin-transform-literals" "^7.16.7"
- "@babel/plugin-transform-member-expression-literals" "^7.16.7"
- "@babel/plugin-transform-modules-amd" "^7.16.7"
- "@babel/plugin-transform-modules-commonjs" "^7.17.9"
- "@babel/plugin-transform-modules-systemjs" "^7.17.8"
- "@babel/plugin-transform-modules-umd" "^7.16.7"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.10"
- "@babel/plugin-transform-new-target" "^7.16.7"
- "@babel/plugin-transform-object-super" "^7.16.7"
- "@babel/plugin-transform-parameters" "^7.16.7"
- "@babel/plugin-transform-property-literals" "^7.16.7"
- "@babel/plugin-transform-regenerator" "^7.17.9"
- "@babel/plugin-transform-reserved-words" "^7.16.7"
- "@babel/plugin-transform-shorthand-properties" "^7.16.7"
- "@babel/plugin-transform-spread" "^7.16.7"
- "@babel/plugin-transform-sticky-regex" "^7.16.7"
- "@babel/plugin-transform-template-literals" "^7.16.7"
- "@babel/plugin-transform-typeof-symbol" "^7.16.7"
- "@babel/plugin-transform-unicode-escapes" "^7.16.7"
- "@babel/plugin-transform-unicode-regex" "^7.16.7"
- "@babel/preset-modules" "^0.1.5"
- "@babel/types" "^7.17.10"
- babel-plugin-polyfill-corejs2 "^0.3.0"
- babel-plugin-polyfill-corejs3 "^0.5.0"
- babel-plugin-polyfill-regenerator "^0.3.0"
- core-js-compat "^3.22.1"
- semver "^6.3.0"
-
-"@babel/preset-modules@^0.1.5":
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9"
- integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
- "@babel/plugin-transform-dotall-regex" "^7.4.4"
- "@babel/types" "^7.4.4"
- esutils "^2.0.2"
-
-"@babel/preset-typescript@^7.3.3":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399"
- integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.18.6"
- "@babel/helper-validator-option" "^7.18.6"
- "@babel/plugin-transform-typescript" "^7.18.6"
-
-"@babel/runtime@^7.8.4":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a"
- integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==
- dependencies:
- regenerator-runtime "^0.13.4"
-
-"@babel/template@^7.16.7", "@babel/template@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31"
- integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==
- dependencies:
- "@babel/code-frame" "^7.18.6"
- "@babel/parser" "^7.18.6"
- "@babel/types" "^7.18.6"
-
-"@babel/template@^7.22.15":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
- integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
- dependencies:
- "@babel/code-frame" "^7.22.13"
- "@babel/parser" "^7.22.15"
- "@babel/types" "^7.22.15"
-
-"@babel/traverse@^7.17.10", "@babel/traverse@^7.18.9":
- version "7.23.6"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5"
- integrity sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==
- dependencies:
- "@babel/code-frame" "^7.23.5"
- "@babel/generator" "^7.23.6"
- "@babel/helper-environment-visitor" "^7.22.20"
- "@babel/helper-function-name" "^7.23.0"
- "@babel/helper-hoist-variables" "^7.22.5"
- "@babel/helper-split-export-declaration" "^7.22.6"
- "@babel/parser" "^7.23.6"
- "@babel/types" "^7.23.6"
- debug "^4.3.1"
- globals "^11.1.0"
-
-"@babel/types@^7.17.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.4.4":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f"
- integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==
- dependencies:
- "@babel/helper-validator-identifier" "^7.18.6"
- to-fast-properties "^2.0.0"
-
-"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6":
- version "7.23.6"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd"
- integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==
- dependencies:
- "@babel/helper-string-parser" "^7.23.4"
- "@babel/helper-validator-identifier" "^7.22.20"
- to-fast-properties "^2.0.0"
-
-"@cspotcode/source-map-consumer@0.8.0":
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
- integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
-
-"@cspotcode/source-map-support@0.7.0":
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5"
- integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==
- dependencies:
- "@cspotcode/source-map-consumer" "0.8.0"
-
-"@csstools/postcss-font-format-keywords@^1.0.0":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a"
- integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-"@csstools/postcss-hwb-function@^1.0.0":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b"
- integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-"@csstools/postcss-is-pseudo-class@^2.0.0":
- version "2.0.7"
- resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1"
- integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==
- dependencies:
- "@csstools/selector-specificity" "^2.0.0"
- postcss-selector-parser "^6.0.10"
-
-"@csstools/postcss-normalize-display-values@^1.0.0":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3"
- integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-"@csstools/postcss-progressive-custom-properties@^1.1.0":
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa"
- integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-"@csstools/selector-specificity@^2.0.0":
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36"
- integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==
-
-"@discoveryjs/json-ext@^0.5.0":
- version "0.5.7"
- resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
- integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
-
-"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
- integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
- dependencies:
- eslint-visitor-keys "^3.3.0"
-
-"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1":
- version "4.10.0"
- resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63"
- integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
-
-"@eslint/eslintrc@^2.1.4":
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad"
- integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
- dependencies:
- ajv "^6.12.4"
- debug "^4.3.2"
- espree "^9.6.0"
- globals "^13.19.0"
- ignore "^5.2.0"
- import-fresh "^3.2.1"
- js-yaml "^4.1.0"
- minimatch "^3.1.2"
- strip-json-comments "^3.1.1"
-
-"@eslint/js@8.57.0":
- version "8.57.0"
- resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f"
- integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==
-
-"@fastify/busboy@1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-1.0.0.tgz#f73182e61955ab91f8ec5a137fda2c9cee366dbd"
- integrity sha512-tzTXX1TFEjWCseEsNdIlXXkD+48uJoN+zpqIojUX4pSoMscsbhO/UuVEB5SzJucexqDWOo2ma0ECwdD7hZdrzg==
- dependencies:
- text-decoding "^1.0.0"
-
-"@fortawesome/fontawesome-free@5.15.4":
- version "5.15.4"
- resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5"
- integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==
-
-"@gar/promisify@^1.0.1":
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
- integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
-
-"@humanwhocodes/config-array@^0.11.14":
- version "0.11.14"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b"
- integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==
- dependencies:
- "@humanwhocodes/object-schema" "^2.0.2"
- debug "^4.3.1"
- minimatch "^3.0.5"
-
-"@humanwhocodes/module-importer@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
- integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
-
-"@humanwhocodes/object-schema@^2.0.2":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
- integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
-
-"@isaacs/cliui@^8.0.2":
- version "8.0.2"
- resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
- integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
- dependencies:
- string-width "^5.1.2"
- string-width-cjs "npm:string-width@^4.2.0"
- strip-ansi "^7.0.1"
- strip-ansi-cjs "npm:strip-ansi@^6.0.1"
- wrap-ansi "^8.1.0"
- wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
-
-"@istanbuljs/load-nyc-config@^1.0.0":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
- integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
- dependencies:
- camelcase "^5.3.1"
- find-up "^4.1.0"
- get-package-type "^0.1.0"
- js-yaml "^3.13.1"
- resolve-from "^5.0.0"
-
-"@istanbuljs/nyc-config-typescript@1.0.2":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz#1f5235b28540a07219ae0dd42014912a0b19cf89"
- integrity sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==
- dependencies:
- "@istanbuljs/schema" "^0.1.2"
-
-"@istanbuljs/schema@^0.1.2":
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
- integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
-
-"@jridgewell/gen-mapping@^0.1.0":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
- integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
- dependencies:
- "@jridgewell/set-array" "^1.0.0"
- "@jridgewell/sourcemap-codec" "^1.4.10"
-
-"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
- integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
- dependencies:
- "@jridgewell/set-array" "^1.0.1"
- "@jridgewell/sourcemap-codec" "^1.4.10"
- "@jridgewell/trace-mapping" "^0.3.9"
-
-"@jridgewell/gen-mapping@^0.3.5":
- version "0.3.5"
- resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
- integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
- dependencies:
- "@jridgewell/set-array" "^1.2.1"
- "@jridgewell/sourcemap-codec" "^1.4.10"
- "@jridgewell/trace-mapping" "^0.3.24"
-
-"@jridgewell/resolve-uri@^3.0.3":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
- integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
-
-"@jridgewell/resolve-uri@^3.1.0":
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
- integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
-
-"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
- integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
-
-"@jridgewell/set-array@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
- integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
-
-"@jridgewell/source-map@^0.3.2":
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
- integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
- dependencies:
- "@jridgewell/gen-mapping" "^0.3.0"
- "@jridgewell/trace-mapping" "^0.3.9"
-
-"@jridgewell/source-map@^0.3.3":
- version "0.3.6"
- resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a"
- integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==
- dependencies:
- "@jridgewell/gen-mapping" "^0.3.5"
- "@jridgewell/trace-mapping" "^0.3.25"
-
-"@jridgewell/sourcemap-codec@^1.4.10":
- version "1.4.14"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
- integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
-
-"@jridgewell/sourcemap-codec@^1.4.14":
- version "1.4.15"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
- integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
-
-"@jridgewell/trace-mapping@^0.3.17":
- version "0.3.20"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f"
- integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==
- dependencies:
- "@jridgewell/resolve-uri" "^3.1.0"
- "@jridgewell/sourcemap-codec" "^1.4.14"
-
-"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
- version "0.3.25"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
- integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
- dependencies:
- "@jridgewell/resolve-uri" "^3.1.0"
- "@jridgewell/sourcemap-codec" "^1.4.14"
-
-"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9":
- version "0.3.14"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
- integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==
- dependencies:
- "@jridgewell/resolve-uri" "^3.0.3"
- "@jridgewell/sourcemap-codec" "^1.4.10"
-
-"@nodelib/fs.scandir@2.1.5":
- version "2.1.5"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
- integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
- dependencies:
- "@nodelib/fs.stat" "2.0.5"
- run-parallel "^1.1.9"
-
-"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
- integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
-
-"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
- version "1.2.8"
- resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
- integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
- dependencies:
- "@nodelib/fs.scandir" "2.1.5"
- fastq "^1.6.0"
-
-"@npmcli/fs@^1.0.0":
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257"
- integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==
- dependencies:
- "@gar/promisify" "^1.0.1"
- semver "^7.3.5"
-
-"@npmcli/move-file@^1.0.1":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674"
- integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==
- dependencies:
- mkdirp "^1.0.4"
- rimraf "^3.0.2"
-
-"@one-ini/wasm@0.1.1":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@one-ini/wasm/-/wasm-0.1.1.tgz#6013659736c9dbfccc96e8a9c2b3de317df39323"
- integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==
-
-"@pkgjs/parseargs@^0.11.0":
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
- integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
-
-"@sindresorhus/is@^4.0.0":
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f"
- integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==
-
-"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1", "@sinonjs/commons@^1.8.3":
- version "1.8.3"
- resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
- integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
- dependencies:
- type-detect "4.0.8"
-
-"@sinonjs/commons@^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3"
- integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==
- dependencies:
- type-detect "4.0.8"
-
-"@sinonjs/fake-timers@^10.0.2":
- version "10.0.2"
- resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c"
- integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==
- dependencies:
- "@sinonjs/commons" "^2.0.0"
-
-"@sinonjs/fake-timers@^6.0.0", "@sinonjs/fake-timers@^6.0.1":
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40"
- integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==
- dependencies:
- "@sinonjs/commons" "^1.7.0"
-
-"@sinonjs/fake-timers@^9.1.2":
- version "9.1.2"
- resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c"
- integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==
- dependencies:
- "@sinonjs/commons" "^1.7.0"
-
-"@sinonjs/samsam@^5.3.1":
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.3.1.tgz#375a45fe6ed4e92fca2fb920e007c48232a6507f"
- integrity sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==
- dependencies:
- "@sinonjs/commons" "^1.6.0"
- lodash.get "^4.4.2"
- type-detect "^4.0.8"
-
-"@sinonjs/samsam@^6.1.1":
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.1.1.tgz#627f7f4cbdb56e6419fa2c1a3e4751ce4f6a00b1"
- integrity sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA==
- dependencies:
- "@sinonjs/commons" "^1.6.0"
- lodash.get "^4.4.2"
- type-detect "^4.0.8"
-
-"@sinonjs/text-encoding@^0.7.1":
- version "0.7.1"
- resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5"
- integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==
-
-"@socket.io/component-emitter@~3.1.0":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553"
- integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==
-
-"@szmarczak/http-timer@^4.0.5":
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
- integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==
- dependencies:
- defer-to-connect "^2.0.0"
-
-"@textcomplete/core@0.1.10":
- version "0.1.10"
- resolved "https://registry.yarnpkg.com/@textcomplete/core/-/core-0.1.10.tgz#80211c20f28a378cc9ee8b6633ddf2034785d8c3"
- integrity sha512-+T7dOElhJivE7+V0JUeDK5TdHUU8Sbuhvnp8VmtHimLaTruv5FJS1dgSjAqGlRcMw9AX459JY9JCbkX9ezGh2g==
- dependencies:
- eventemitter3 "^4.0.4"
-
-"@textcomplete/textarea@0.1.13":
- version "0.1.13"
- resolved "https://registry.yarnpkg.com/@textcomplete/textarea/-/textarea-0.1.13.tgz#a0e365877bdce1c16ec48bdd439cd44d28a903ef"
- integrity sha512-GNathnXpV361YuZrBVXvVqFYZ5NQZsjGC7Bt2sCUA/RTWlIgxHxC0ruDChYyRDx4siQZiZZOO5pWz+z1x8pZFQ==
- dependencies:
- "@textcomplete/utils" "^0.1.13"
- textarea-caret "^3.1.0"
- undate "^0.3.0"
-
-"@textcomplete/utils@^0.1.13":
- version "0.1.13"
- resolved "https://registry.yarnpkg.com/@textcomplete/utils/-/utils-0.1.13.tgz#0b56a5a876fb27478b702e3ea118fa75960b4331"
- integrity sha512-5UW9Ee0WEX1s9K8MFffo5sfUjYm3YVhtqRhAor/ih7p0tnnpaMB7AwMRDKwhSIQL6O+g1fmEkxCeO8WqjPzjUA==
-
-"@tokenizer/token@^0.3.0":
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276"
- integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==
-
-"@tootallnate/once@1":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
- integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
-
-"@trysound/sax@0.2.0":
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
- integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
-
-"@tsconfig/node10@^1.0.7":
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2"
- integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==
-
-"@tsconfig/node12@^1.0.7":
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d"
- integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
-
-"@tsconfig/node14@^1.0.0":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1"
- integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
-
-"@tsconfig/node16@^1.0.2":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e"
- integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==
-
-"@types/bcryptjs@2.4.6":
- version "2.4.6"
- resolved "https://registry.yarnpkg.com/@types/bcryptjs/-/bcryptjs-2.4.6.tgz#2b92e3c2121c66eba3901e64faf8bb922ec291fa"
- integrity sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==
-
-"@types/body-parser@*":
- version "1.19.2"
- resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0"
- integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==
- dependencies:
- "@types/connect" "*"
- "@types/node" "*"
-
-"@types/cacheable-request@^6.0.1":
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9"
- integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==
- dependencies:
- "@types/http-cache-semantics" "*"
- "@types/keyv" "*"
- "@types/node" "*"
- "@types/responselike" "*"
-
-"@types/chai@*":
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04"
- integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ==
-
-"@types/chai@4.3.5":
- version "4.3.5"
- resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b"
- integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==
-
-"@types/cheerio@0.22.35":
- version "0.22.35"
- resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.35.tgz#0d16dc1f24d426231c181b9c31847f673867595f"
- integrity sha512-yD57BchKRvTV+JD53UZ6PD8KWY5g5rvvMLRnZR3EQBCZXiDT/HR+pKpMzFGlWNhFrXlo7VPZXtKvIEwZkAWOIA==
- dependencies:
- "@types/node" "*"
-
-"@types/connect@*":
- version "3.4.35"
- resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
- integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==
- dependencies:
- "@types/node" "*"
-
-"@types/content-disposition@0.5.8":
- version "0.5.8"
- resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.8.tgz#6742a5971f490dc41e59d277eee71361fea0b537"
- integrity sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==
-
-"@types/cookie@^0.4.1":
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d"
- integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==
-
-"@types/cors@^2.8.12":
- version "2.8.12"
- resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080"
- integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==
-
-"@types/eslint-scope@^3.7.3":
- version "3.7.4"
- resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16"
- integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==
- dependencies:
- "@types/eslint" "*"
- "@types/estree" "*"
-
-"@types/eslint@*":
- version "8.4.5"
- resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.5.tgz#acdfb7dd36b91cc5d812d7c093811a8f3d9b31e4"
- integrity sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==
- dependencies:
- "@types/estree" "*"
- "@types/json-schema" "*"
-
-"@types/estree@*":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2"
- integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==
-
-"@types/estree@^0.0.51":
- version "0.0.51"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
- integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
-
-"@types/estree@^1.0.5":
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
- integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
-
-"@types/express-serve-static-core@^4.17.33":
- version "4.17.43"
- resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54"
- integrity sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==
- dependencies:
- "@types/node" "*"
- "@types/qs" "*"
- "@types/range-parser" "*"
- "@types/send" "*"
-
-"@types/express@4.17.21":
- version "4.17.21"
- resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d"
- integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==
- dependencies:
- "@types/body-parser" "*"
- "@types/express-serve-static-core" "^4.17.33"
- "@types/qs" "*"
- "@types/serve-static" "*"
-
-"@types/http-cache-semantics@*":
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812"
- integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==
-
-"@types/is-utf8@0.2.3":
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/@types/is-utf8/-/is-utf8-0.2.3.tgz#4821e365f6518778bd7c9b3f8b3a5c42a8e96706"
- integrity sha512-pOsafTvuyh/FBJm+LP81graldeJLPtJ/UcfqzD+qNoey7PpG2saE/v+h8r4gxT6BGO8mzAuK2fkYLr6goOdwwg==
- dependencies:
- "@types/node" "*"
-
-"@types/json-buffer@~3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64"
- integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==
-
-"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
- version "7.0.11"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
- integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
-
-"@types/json-schema@^7.0.15":
- version "7.0.15"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
- integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
-
-"@types/keyv@*":
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6"
- integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==
- dependencies:
- "@types/node" "*"
-
-"@types/ldapjs@2.2.5":
- version "2.2.5"
- resolved "https://registry.yarnpkg.com/@types/ldapjs/-/ldapjs-2.2.5.tgz#b6623bc5ad4fab85ef3cfa586db691d016a3598c"
- integrity sha512-Lv/nD6QDCmcT+V1vaTRnEKE8UgOilVv5pHcQuzkU1LcRe4mbHHuUo/KHi0LKrpdHhQY8FJzryF38fcVdeUIrzg==
- dependencies:
- "@types/node" "*"
-
-"@types/linkify-it@3.0.5":
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.5.tgz#1e78a3ac2428e6d7e6c05c1665c242023a4601d8"
- integrity sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==
-
-"@types/lodash@4.14.202":
- version "4.14.202"
- resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8"
- integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==
-
-"@types/mime-types@2.1.4":
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.4.tgz#93a1933e24fed4fb9e4adc5963a63efcbb3317a2"
- integrity sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==
-
-"@types/mime@^1":
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
- integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
-
-"@types/minimatch@^3.0.3":
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
- integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
-
-"@types/minimist@^1.2.0":
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
- integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
-
-"@types/mocha@9.1.1":
- version "9.1.1"
- resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4"
- integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==
-
-"@types/mousetrap@1.6.15":
- version "1.6.15"
- resolved "https://registry.yarnpkg.com/@types/mousetrap/-/mousetrap-1.6.15.tgz#f144a0c539a4cef553a631824651d48267e53c86"
- integrity sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw==
-
-"@types/node@*", "@types/node@>=10.0.0":
- version "18.11.9"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4"
- integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==
-
-"@types/node@17.0.45":
- version "17.0.45"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190"
- integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==
-
-"@types/node@^14.6.1":
- version "14.18.22"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.22.tgz#fd2a15dca290fc9ad565b672fde746191cd0c6e6"
- integrity sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw==
-
-"@types/normalize-package-data@^2.4.0":
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
- integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==
-
-"@types/parse-json@^4.0.0":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
- integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
-
-"@types/qs@*":
- version "6.9.7"
- resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
- integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
-
-"@types/range-parser@*":
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
- integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
-
-"@types/read@0.0.32":
- version "0.0.32"
- resolved "https://registry.yarnpkg.com/@types/read/-/read-0.0.32.tgz#0a66e636cbb884e66f9faca986b5de8bea9af47f"
- integrity sha512-BbcOjC8nPoAKYK500K4ckuAJgiSZKc+4SBc+Isnf7AP088RNvCTqFay69bnRG6oOYf3/Kba4DVMLFEUrgAlZtA==
-
-"@types/responselike@*", "@types/responselike@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
- integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==
- dependencies:
- "@types/node" "*"
-
-"@types/semver@7.3.9":
- version "7.3.9"
- resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc"
- integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==
-
-"@types/semver@^7.5.8":
- version "7.5.8"
- resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e"
- integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==
-
-"@types/send@*":
- version "0.17.4"
- resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a"
- integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==
- dependencies:
- "@types/mime" "^1"
- "@types/node" "*"
-
-"@types/serve-static@*":
- version "1.13.10"
- resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9"
- integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==
- dependencies:
- "@types/mime" "^1"
- "@types/node" "*"
-
-"@types/sinon-chai@^3.2.4":
- version "3.2.8"
- resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.8.tgz#5871d09ab50d671d8e6dd72e9073f8e738ac61dc"
- integrity sha512-d4ImIQbT/rKMG8+AXpmcan5T2/PNeSjrYhvkwet6z0p8kzYtfgA32xzOBlbU0yqJfq+/0Ml805iFoODO0LP5/g==
- dependencies:
- "@types/chai" "*"
- "@types/sinon" "*"
-
-"@types/sinon@*":
- version "10.0.13"
- resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.13.tgz#60a7a87a70d9372d0b7b38cc03e825f46981fb83"
- integrity sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==
- dependencies:
- "@types/sinonjs__fake-timers" "*"
-
-"@types/sinon@^9.0.5":
- version "9.0.11"
- resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-9.0.11.tgz#7af202dda5253a847b511c929d8b6dda170562eb"
- integrity sha512-PwP4UY33SeeVKodNE37ZlOsR9cReypbMJOhZ7BVE0lB+Hix3efCOxiJWiE5Ia+yL9Cn2Ch72EjFTRze8RZsNtg==
- dependencies:
- "@types/sinonjs__fake-timers" "*"
-
-"@types/sinonjs__fake-timers@*":
- version "8.1.2"
- resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e"
- integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==
-
-"@types/sortablejs@1.15.8":
- version "1.15.8"
- resolved "https://registry.yarnpkg.com/@types/sortablejs/-/sortablejs-1.15.8.tgz#11ed555076046e00869a5ef85d1e7651e7a66ef6"
- integrity sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==
-
-"@types/sqlite3@3.1.11":
- version "3.1.11"
- resolved "https://registry.yarnpkg.com/@types/sqlite3/-/sqlite3-3.1.11.tgz#845044b81585f1fcc143ee8d963ca5da63d0e768"
- integrity sha512-KYF+QgxAnnAh7DWPdNDroxkDI3/MspH1NMx6m/N/6fT1G6+jvsw4/ZePt8R8cr7ta58aboeTfYFBDxTJ5yv15w==
- dependencies:
- "@types/node" "*"
-
-"@types/ua-parser-js@0.7.39":
- version "0.7.39"
- resolved "https://registry.yarnpkg.com/@types/ua-parser-js/-/ua-parser-js-0.7.39.tgz#832c58e460c9435e4e34bb866e85e9146e12cdbb"
- integrity sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==
-
-"@types/uuid@8.3.4":
- version "8.3.4"
- resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc"
- integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==
-
-"@types/web-push@3.3.2":
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/@types/web-push/-/web-push-3.3.2.tgz#8c32434147c0396415862e86405c9edc9c50fc15"
- integrity sha512-JxWGVL/m7mWTIg4mRYO+A6s0jPmBkr4iJr39DqJpRJAc+jrPiEe1/asmkwerzRon8ZZDxaZJpsxpv0Z18Wo9gw==
- dependencies:
- "@types/node" "*"
-
-"@types/webpack-env@1.16.4":
- version "1.16.4"
- resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.4.tgz#1f4969042bf76d7ef7b5914f59b3b60073f4e1f4"
- integrity sha512-llS8qveOUX3wxHnSykP5hlYFFuMfJ9p5JvIyCiBgp7WTfl6K5ZcyHj8r8JsN/J6QODkAsRRCLIcTuOCu8etkUw==
-
-"@types/webpack-hot-middleware@2.25.6":
- version "2.25.6"
- resolved "https://registry.yarnpkg.com/@types/webpack-hot-middleware/-/webpack-hot-middleware-2.25.6.tgz#4336abd668dc73284a777907cfd00147e794354a"
- integrity sha512-1Q9ClNvZR30HIsEAHYQL3bXJK1K7IsrqjGMTfIureFjphsGOZ3TkbeoCupbCmi26pSLjVTPHp+pFrJNpOkBSVg==
- dependencies:
- "@types/connect" "*"
- tapable "^2.2.0"
- webpack "^5"
-
-"@types/ws@8.5.12":
- version "8.5.12"
- resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e"
- integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==
- dependencies:
- "@types/node" "*"
-
-"@typescript-eslint/eslint-plugin@7.8.0":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz#c78e309fe967cb4de05b85cdc876fb95f8e01b6f"
- integrity sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==
- dependencies:
- "@eslint-community/regexpp" "^4.10.0"
- "@typescript-eslint/scope-manager" "7.8.0"
- "@typescript-eslint/type-utils" "7.8.0"
- "@typescript-eslint/utils" "7.8.0"
- "@typescript-eslint/visitor-keys" "7.8.0"
- debug "^4.3.4"
- graphemer "^1.4.0"
- ignore "^5.3.1"
- natural-compare "^1.4.0"
- semver "^7.6.0"
- ts-api-utils "^1.3.0"
-
-"@typescript-eslint/parser@7.8.0":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.8.0.tgz#1e1db30c8ab832caffee5f37e677dbcb9357ddc8"
- integrity sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==
- dependencies:
- "@typescript-eslint/scope-manager" "7.8.0"
- "@typescript-eslint/types" "7.8.0"
- "@typescript-eslint/typescript-estree" "7.8.0"
- "@typescript-eslint/visitor-keys" "7.8.0"
- debug "^4.3.4"
-
-"@typescript-eslint/scope-manager@7.8.0":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz#bb19096d11ec6b87fb6640d921df19b813e02047"
- integrity sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==
- dependencies:
- "@typescript-eslint/types" "7.8.0"
- "@typescript-eslint/visitor-keys" "7.8.0"
-
-"@typescript-eslint/type-utils@7.8.0":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz#9de166f182a6e4d1c5da76e94880e91831e3e26f"
- integrity sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==
- dependencies:
- "@typescript-eslint/typescript-estree" "7.8.0"
- "@typescript-eslint/utils" "7.8.0"
- debug "^4.3.4"
- ts-api-utils "^1.3.0"
-
-"@typescript-eslint/types@7.8.0":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.8.0.tgz#1fd2577b3ad883b769546e2d1ef379f929a7091d"
- integrity sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==
-
-"@typescript-eslint/typescript-estree@7.8.0":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz#b028a9226860b66e623c1ee55cc2464b95d2987c"
- integrity sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==
- dependencies:
- "@typescript-eslint/types" "7.8.0"
- "@typescript-eslint/visitor-keys" "7.8.0"
- debug "^4.3.4"
- globby "^11.1.0"
- is-glob "^4.0.3"
- minimatch "^9.0.4"
- semver "^7.6.0"
- ts-api-utils "^1.3.0"
-
-"@typescript-eslint/utils@7.8.0":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.8.0.tgz#57a79f9c0c0740ead2f622e444cfaeeb9fd047cd"
- integrity sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==
- dependencies:
- "@eslint-community/eslint-utils" "^4.4.0"
- "@types/json-schema" "^7.0.15"
- "@types/semver" "^7.5.8"
- "@typescript-eslint/scope-manager" "7.8.0"
- "@typescript-eslint/types" "7.8.0"
- "@typescript-eslint/typescript-estree" "7.8.0"
- semver "^7.6.0"
-
-"@typescript-eslint/visitor-keys@7.8.0":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz#7285aab991da8bee411a42edbd5db760d22fdd91"
- integrity sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==
- dependencies:
- "@typescript-eslint/types" "7.8.0"
- eslint-visitor-keys "^3.4.3"
-
-"@ungap/promise-all-settled@1.1.2":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
- integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
-
-"@ungap/structured-clone@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
- integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
-
-"@vue/compiler-core@3.2.35":
- version "3.2.35"
- resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.35.tgz#f2fc01bd25d859a77b0d9ef5df28f657c1979070"
- integrity sha512-1Mtmh8ceVUoUsn/PME5oM+Dus648rCeV/fBaZ4ERLFbTHBJXj6QmDPrSn9mfEyPDXE0RYIwyJNn884NdWK+Yiw==
- dependencies:
- "@babel/parser" "^7.16.4"
- "@vue/shared" "3.2.35"
- estree-walker "^2.0.2"
- source-map "^0.6.1"
-
-"@vue/compiler-core@3.2.37":
- version "3.2.37"
- resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.37.tgz#b3c42e04c0e0f2c496ff1784e543fbefe91e215a"
- integrity sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==
- dependencies:
- "@babel/parser" "^7.16.4"
- "@vue/shared" "3.2.37"
- estree-walker "^2.0.2"
- source-map "^0.6.1"
-
-"@vue/compiler-dom@3.2.35":
- version "3.2.35"
- resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.35.tgz#11bbcca0d49f9991d64dd8fbf8a0a4453caa571c"
- integrity sha512-I4bXB9MkRSTJ3gVXRQ4iaYJgABZGew+K/CCBoAh9fdLaeY7A7uUlS5nWGOlICSVfOH0/xk4QlcXeGZYCJkEleA==
- dependencies:
- "@vue/compiler-core" "3.2.35"
- "@vue/shared" "3.2.35"
-
-"@vue/compiler-dom@3.2.37":
- version "3.2.37"
- resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz#10d2427a789e7c707c872da9d678c82a0c6582b5"
- integrity sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==
- dependencies:
- "@vue/compiler-core" "3.2.37"
- "@vue/shared" "3.2.37"
-
-"@vue/compiler-sfc@3.2.35":
- version "3.2.35"
- resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.35.tgz#1de80f858b33548bc22d166126234435937ebe0c"
- integrity sha512-2wKQtnuHfwBFc7uV2Cmtms3Cc7u/u6kKJI3F+i0A+9xnuahK39cCMNJKHzI9x93Xai+uft64fDc5JSh8zDQBQA==
- dependencies:
- "@babel/parser" "^7.16.4"
- "@vue/compiler-core" "3.2.35"
- "@vue/compiler-dom" "3.2.35"
- "@vue/compiler-ssr" "3.2.35"
- "@vue/reactivity-transform" "3.2.35"
- "@vue/shared" "3.2.35"
- estree-walker "^2.0.2"
- magic-string "^0.25.7"
- postcss "^8.1.10"
- source-map "^0.6.1"
-
-"@vue/compiler-sfc@^3.0.5":
- version "3.2.37"
- resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz#3103af3da2f40286edcd85ea495dcb35bc7f5ff4"
- integrity sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==
- dependencies:
- "@babel/parser" "^7.16.4"
- "@vue/compiler-core" "3.2.37"
- "@vue/compiler-dom" "3.2.37"
- "@vue/compiler-ssr" "3.2.37"
- "@vue/reactivity-transform" "3.2.37"
- "@vue/shared" "3.2.37"
- estree-walker "^2.0.2"
- magic-string "^0.25.7"
- postcss "^8.1.10"
- source-map "^0.6.1"
-
-"@vue/compiler-ssr@3.2.35":
- version "3.2.35"
- resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.35.tgz#8d7726f95444c02f3301083e2c6c814780fb7b00"
- integrity sha512-dJyqB8fZbvVQEnWl5VGxkWHTqx0ERnZXXqInFzyOX8FpTEidmQbUSmDrXidea7bZTdeg6ly94kZFGPYXT29mgQ==
- dependencies:
- "@vue/compiler-dom" "3.2.35"
- "@vue/shared" "3.2.35"
-
-"@vue/compiler-ssr@3.2.37":
- version "3.2.37"
- resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz#4899d19f3a5fafd61524a9d1aee8eb0505313cff"
- integrity sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==
- dependencies:
- "@vue/compiler-dom" "3.2.37"
- "@vue/shared" "3.2.37"
-
-"@vue/devtools-api@^6.0.0", "@vue/devtools-api@^6.0.0-beta.11":
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz#6f2948ff002ec46df01420dfeff91de16c5b4092"
- integrity sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==
-
-"@vue/reactivity-transform@3.2.35":
- version "3.2.35"
- resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.35.tgz#29ba344b0ec9ec7ee75ca6c1a6f349595ca150d8"
- integrity sha512-VjdQU4nIrgsh1iPqAdYZufWgFqdH9fIl6ttO2PCFlLsrQl7b8BcuawM6moSBLF8damBzSNcqvbvQDBhsI3fyVQ==
- dependencies:
- "@babel/parser" "^7.16.4"
- "@vue/compiler-core" "3.2.35"
- "@vue/shared" "3.2.35"
- estree-walker "^2.0.2"
- magic-string "^0.25.7"
-
-"@vue/reactivity-transform@3.2.37":
- version "3.2.37"
- resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz#0caa47c4344df4ae59f5a05dde2a8758829f8eca"
- integrity sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==
- dependencies:
- "@babel/parser" "^7.16.4"
- "@vue/compiler-core" "3.2.37"
- "@vue/shared" "3.2.37"
- estree-walker "^2.0.2"
- magic-string "^0.25.7"
-
-"@vue/reactivity@3.2.33":
- version "3.2.33"
- resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.33.tgz#c84eedb5225138dbfc2472864c151d3efbb4b673"
- integrity sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ==
- dependencies:
- "@vue/shared" "3.2.33"
-
-"@vue/reactivity@3.2.35":
- version "3.2.35"
- resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.35.tgz#c66af289f3beda6aba63c264db9c6acd607d1c73"
- integrity sha512-6j9N9R1SwHVcJas4YqAzwdRS/cgmj3Z9aUert5Mv1jk5B9H9ivN/zot/fgMUbseWXigkkmX60OsfRbz49o8kCw==
- dependencies:
- "@vue/shared" "3.2.35"
-
-"@vue/runtime-core@3.2.33":
- version "3.2.33"
- resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.33.tgz#2df8907c85c37c3419fbd1bdf1a2df097fa40df2"
- integrity sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw==
- dependencies:
- "@vue/reactivity" "3.2.33"
- "@vue/shared" "3.2.33"
-
-"@vue/runtime-core@3.2.35":
- version "3.2.35"
- resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.35.tgz#a87bd5214ff31f9dc6542f5c498d4f3543c6ea8f"
- integrity sha512-P8AeGPRGyIiYdOdvLc/7KR8VSdbUGG8Jxdx6Xlj5okEjyV9IYxeHRIQIoye85K0lZXBH4zuh1syD1mX+oZ0KqQ==
- dependencies:
- "@vue/reactivity" "3.2.35"
- "@vue/shared" "3.2.35"
-
-"@vue/runtime-dom@3.2.33":
- version "3.2.33"
- resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.33.tgz#123b8969247029ea0d9c1983676d4706a962d848"
- integrity sha512-LSrJ6W7CZTSUygX5s8aFkraDWlO6K4geOwA3quFF2O+hC3QuAMZt/0Xb7JKE3C4JD4pFwCSO7oCrZmZ0BIJUnw==
- dependencies:
- "@vue/runtime-core" "3.2.33"
- "@vue/shared" "3.2.33"
- csstype "^2.6.8"
-
-"@vue/runtime-dom@3.2.35":
- version "3.2.35"
- resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.35.tgz#004bf6109353e75cf22eb11baf247288c216ef7b"
- integrity sha512-M5xrVJ/b0KqssjPQMdpwLp3KwzG1Tn2w/IrOptVqGY5c9fEBluIbm18AeO4Fr3YxfeyaPWm1rY8POrEso0UE3w==
- dependencies:
- "@vue/runtime-core" "3.2.35"
- "@vue/shared" "3.2.35"
- csstype "^2.6.8"
-
-"@vue/server-renderer@3.2.35":
- version "3.2.35"
- resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.35.tgz#79fb9e2315ec6196b5f2f385ef4ae31cf5599a2f"
- integrity sha512-ZMF8V+bZ0EIjSB7yzPEmDlxRDOIXj04iqG4Rw/H5rIuBCf0b7rNTleiOldlX5haG++zUq6uiL2AVp/A9uyz+cw==
- dependencies:
- "@vue/compiler-ssr" "3.2.35"
- "@vue/shared" "3.2.35"
-
-"@vue/shared@3.2.33":
- version "3.2.33"
- resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.33.tgz#69a8c99ceb37c1b031d5cc4aec2ff1dc77e1161e"
- integrity sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg==
-
-"@vue/shared@3.2.35":
- version "3.2.35"
- resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.35.tgz#fb60530fa009dc21473386a7639eed833877cb0f"
- integrity sha512-/sxDqMcy0MsfQ3LQixKYDxIinDYNy1dXTsF2Am0pv0toImWabymFQ8cFmPJnPt+gh5ElKwwn7KzQcDbLHar60A==
-
-"@vue/shared@3.2.37":
- version "3.2.37"
- resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.37.tgz#8e6adc3f2759af52f0e85863dfb0b711ecc5c702"
- integrity sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==
-
-"@vue/test-utils@2.4.6":
- version "2.4.6"
- resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.4.6.tgz#7d534e70c4319d2a587d6a3b45a39e9695ade03c"
- integrity sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==
- dependencies:
- js-beautify "^1.14.9"
- vue-component-type-helpers "^2.0.0"
-
-"@webassemblyjs/ast@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
- integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
- dependencies:
- "@webassemblyjs/helper-numbers" "1.11.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
-
-"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1":
- version "1.12.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb"
- integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==
- dependencies:
- "@webassemblyjs/helper-numbers" "1.11.6"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
-
-"@webassemblyjs/floating-point-hex-parser@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
- integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
-
-"@webassemblyjs/floating-point-hex-parser@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431"
- integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==
-
-"@webassemblyjs/helper-api-error@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
- integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
-
-"@webassemblyjs/helper-api-error@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768"
- integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==
-
-"@webassemblyjs/helper-buffer@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
- integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
-
-"@webassemblyjs/helper-buffer@1.12.1":
- version "1.12.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6"
- integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==
-
-"@webassemblyjs/helper-numbers@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
- integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
- dependencies:
- "@webassemblyjs/floating-point-hex-parser" "1.11.1"
- "@webassemblyjs/helper-api-error" "1.11.1"
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/helper-numbers@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5"
- integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==
- dependencies:
- "@webassemblyjs/floating-point-hex-parser" "1.11.6"
- "@webassemblyjs/helper-api-error" "1.11.6"
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/helper-wasm-bytecode@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
- integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
-
-"@webassemblyjs/helper-wasm-bytecode@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9"
- integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==
-
-"@webassemblyjs/helper-wasm-section@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
- integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
- dependencies:
- "@webassemblyjs/ast" "1.11.1"
- "@webassemblyjs/helper-buffer" "1.11.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
- "@webassemblyjs/wasm-gen" "1.11.1"
-
-"@webassemblyjs/helper-wasm-section@1.12.1":
- version "1.12.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf"
- integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==
- dependencies:
- "@webassemblyjs/ast" "1.12.1"
- "@webassemblyjs/helper-buffer" "1.12.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
- "@webassemblyjs/wasm-gen" "1.12.1"
-
-"@webassemblyjs/ieee754@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
- integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
- dependencies:
- "@xtuc/ieee754" "^1.2.0"
-
-"@webassemblyjs/ieee754@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a"
- integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==
- dependencies:
- "@xtuc/ieee754" "^1.2.0"
-
-"@webassemblyjs/leb128@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
- integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
- dependencies:
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/leb128@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7"
- integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==
- dependencies:
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/utf8@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
- integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
-
-"@webassemblyjs/utf8@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a"
- integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==
-
-"@webassemblyjs/wasm-edit@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
- integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
- dependencies:
- "@webassemblyjs/ast" "1.11.1"
- "@webassemblyjs/helper-buffer" "1.11.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
- "@webassemblyjs/helper-wasm-section" "1.11.1"
- "@webassemblyjs/wasm-gen" "1.11.1"
- "@webassemblyjs/wasm-opt" "1.11.1"
- "@webassemblyjs/wasm-parser" "1.11.1"
- "@webassemblyjs/wast-printer" "1.11.1"
-
-"@webassemblyjs/wasm-edit@^1.12.1":
- version "1.12.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b"
- integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==
- dependencies:
- "@webassemblyjs/ast" "1.12.1"
- "@webassemblyjs/helper-buffer" "1.12.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
- "@webassemblyjs/helper-wasm-section" "1.12.1"
- "@webassemblyjs/wasm-gen" "1.12.1"
- "@webassemblyjs/wasm-opt" "1.12.1"
- "@webassemblyjs/wasm-parser" "1.12.1"
- "@webassemblyjs/wast-printer" "1.12.1"
-
-"@webassemblyjs/wasm-gen@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
- integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
- dependencies:
- "@webassemblyjs/ast" "1.11.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
- "@webassemblyjs/ieee754" "1.11.1"
- "@webassemblyjs/leb128" "1.11.1"
- "@webassemblyjs/utf8" "1.11.1"
-
-"@webassemblyjs/wasm-gen@1.12.1":
- version "1.12.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547"
- integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==
- dependencies:
- "@webassemblyjs/ast" "1.12.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
- "@webassemblyjs/ieee754" "1.11.6"
- "@webassemblyjs/leb128" "1.11.6"
- "@webassemblyjs/utf8" "1.11.6"
-
-"@webassemblyjs/wasm-opt@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
- integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
- dependencies:
- "@webassemblyjs/ast" "1.11.1"
- "@webassemblyjs/helper-buffer" "1.11.1"
- "@webassemblyjs/wasm-gen" "1.11.1"
- "@webassemblyjs/wasm-parser" "1.11.1"
-
-"@webassemblyjs/wasm-opt@1.12.1":
- version "1.12.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5"
- integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==
- dependencies:
- "@webassemblyjs/ast" "1.12.1"
- "@webassemblyjs/helper-buffer" "1.12.1"
- "@webassemblyjs/wasm-gen" "1.12.1"
- "@webassemblyjs/wasm-parser" "1.12.1"
-
-"@webassemblyjs/wasm-parser@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
- integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
- dependencies:
- "@webassemblyjs/ast" "1.11.1"
- "@webassemblyjs/helper-api-error" "1.11.1"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
- "@webassemblyjs/ieee754" "1.11.1"
- "@webassemblyjs/leb128" "1.11.1"
- "@webassemblyjs/utf8" "1.11.1"
-
-"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1":
- version "1.12.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937"
- integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==
- dependencies:
- "@webassemblyjs/ast" "1.12.1"
- "@webassemblyjs/helper-api-error" "1.11.6"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
- "@webassemblyjs/ieee754" "1.11.6"
- "@webassemblyjs/leb128" "1.11.6"
- "@webassemblyjs/utf8" "1.11.6"
-
-"@webassemblyjs/wast-printer@1.11.1":
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
- integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
- dependencies:
- "@webassemblyjs/ast" "1.11.1"
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/wast-printer@1.12.1":
- version "1.12.1"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac"
- integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==
- dependencies:
- "@webassemblyjs/ast" "1.12.1"
- "@xtuc/long" "4.2.2"
-
-"@webpack-cli/configtest@^1.1.1":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5"
- integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==
-
-"@webpack-cli/info@^1.4.1":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1"
- integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==
- dependencies:
- envinfo "^7.7.3"
-
-"@webpack-cli/serve@^1.6.1":
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1"
- integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==
-
-"@xtuc/ieee754@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
- integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
-
-"@xtuc/long@4.2.2":
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
- integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-
-abbrev@1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
- integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
-
-abbrev@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf"
- integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==
-
-abstract-logging@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839"
- integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==
-
-accepts@~1.3.4, accepts@~1.3.8:
- version "1.3.8"
- resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
- integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
- dependencies:
- mime-types "~2.1.34"
- negotiator "0.6.3"
-
-acorn-import-assertions@^1.7.6:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
- integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
-
-acorn-import-attributes@^1.9.5:
- version "1.9.5"
- resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef"
- integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==
-
-acorn-jsx@^5.3.2:
- version "5.3.2"
- resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
- integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-
-acorn-walk@^8.1.1:
- version "8.2.0"
- resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
- integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
-
-acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1:
- version "8.8.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
- integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
-
-acorn@^8.8.2:
- version "8.12.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248"
- integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
-
-acorn@^8.9.0:
- version "8.11.3"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
- integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
-
-agent-base@6, agent-base@^6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
- integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
- dependencies:
- debug "4"
-
-agentkeepalive@^4.1.3:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717"
- integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==
- dependencies:
- debug "^4.1.0"
- depd "^1.1.2"
- humanize-ms "^1.2.1"
-
-aggregate-error@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
- integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
- dependencies:
- clean-stack "^2.0.0"
- indent-string "^4.0.0"
-
-ajv-formats@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520"
- integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==
- dependencies:
- ajv "^8.0.0"
-
-ajv-keywords@^3.5.2:
- version "3.5.2"
- resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
- integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
-
-ajv-keywords@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16"
- integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==
- dependencies:
- fast-deep-equal "^3.1.3"
-
-ajv@^6.12.4, ajv@^6.12.5:
- version "6.12.6"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
- integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
- dependencies:
- fast-deep-equal "^3.1.1"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.4.1"
- uri-js "^4.2.2"
-
-ajv@^8.0.0, ajv@^8.0.1, ajv@^8.8.0:
- version "8.11.0"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f"
- integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==
- dependencies:
- fast-deep-equal "^3.1.1"
- json-schema-traverse "^1.0.0"
- require-from-string "^2.0.2"
- uri-js "^4.2.2"
-
-ansi-colors@4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
- integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
-
-ansi-html-community@0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41"
- integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==
-
-ansi-regex@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
- integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
-
-ansi-regex@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
- integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
-
-ansi-styles@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
- integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
- dependencies:
- color-convert "^1.9.0"
-
-ansi-styles@^4.0.0, ansi-styles@^4.1.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
- integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
- dependencies:
- color-convert "^2.0.1"
-
-ansi-styles@^6.1.0:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
- integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
-
-anymatch@~3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
- integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
- dependencies:
- normalize-path "^3.0.0"
- picomatch "^2.0.4"
-
-append-transform@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12"
- integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==
- dependencies:
- default-require-extensions "^3.0.0"
-
-"aproba@^1.0.3 || ^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
- integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
-
-archy@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
- integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==
-
-are-we-there-yet@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz#ba20bd6b553e31d62fc8c31bd23d22b95734390d"
- integrity sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==
- dependencies:
- delegates "^1.0.0"
- readable-stream "^3.6.0"
-
-arg@^4.1.0:
- version "4.1.3"
- resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
- integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
-
-argparse@^1.0.7:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
- integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
- dependencies:
- sprintf-js "~1.0.2"
-
-argparse@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
- integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-
-array-buffer-byte-length@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f"
- integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
- dependencies:
- call-bind "^1.0.5"
- is-array-buffer "^3.0.4"
-
-array-differ@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b"
- integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==
-
-array-flatten@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
- integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
-
-array-union@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
- integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-
-array-union@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975"
- integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==
-
-arraybuffer.prototype.slice@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6"
- integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==
- dependencies:
- array-buffer-byte-length "^1.0.1"
- call-bind "^1.0.5"
- define-properties "^1.2.1"
- es-abstract "^1.22.3"
- es-errors "^1.2.1"
- get-intrinsic "^1.2.3"
- is-array-buffer "^3.0.4"
- is-shared-array-buffer "^1.0.2"
-
-arrify@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
- integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==
-
-arrify@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
- integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==
-
-asn1.js@^5.3.0:
- version "5.4.1"
- resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
- integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
- dependencies:
- bn.js "^4.0.0"
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
- safer-buffer "^2.1.0"
-
-asn1@^0.2.4:
- version "0.2.6"
- resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
- integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
- dependencies:
- safer-buffer "~2.1.0"
-
-assert-plus@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
- integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==
-
-assertion-error@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
- integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
-
-astral-regex@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
- integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
-
-autoprefixer@^10.4.2:
- version "10.4.7"
- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf"
- integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==
- dependencies:
- browserslist "^4.20.3"
- caniuse-lite "^1.0.30001335"
- fraction.js "^4.2.0"
- normalize-range "^0.1.2"
- picocolors "^1.0.0"
- postcss-value-parser "^4.2.0"
-
-available-typed-arrays@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
- integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
- dependencies:
- possible-typed-array-names "^1.0.0"
-
-babel-loader@8.2.5:
- version "8.2.5"
- resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e"
- integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==
- dependencies:
- find-cache-dir "^3.3.1"
- loader-utils "^2.0.0"
- make-dir "^3.1.0"
- schema-utils "^2.6.5"
-
-babel-plugin-dynamic-import-node@^2.3.3:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
- integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
- dependencies:
- object.assign "^4.1.0"
-
-babel-plugin-istanbul@6.1.1:
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
- integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@istanbuljs/load-nyc-config" "^1.0.0"
- "@istanbuljs/schema" "^0.1.2"
- istanbul-lib-instrument "^5.0.4"
- test-exclude "^6.0.0"
-
-babel-plugin-polyfill-corejs2@^0.3.0:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz#e4c31d4c89b56f3cf85b92558954c66b54bd972d"
- integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==
- dependencies:
- "@babel/compat-data" "^7.17.7"
- "@babel/helper-define-polyfill-provider" "^0.3.2"
- semver "^6.1.1"
-
-babel-plugin-polyfill-corejs3@^0.5.0:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7"
- integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==
- dependencies:
- "@babel/helper-define-polyfill-provider" "^0.3.2"
- core-js-compat "^3.21.0"
-
-babel-plugin-polyfill-regenerator@^0.3.0:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990"
- integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==
- dependencies:
- "@babel/helper-define-polyfill-provider" "^0.3.1"
-
-babel-preset-typescript-vue3@2.0.17:
- version "2.0.17"
- resolved "https://registry.yarnpkg.com/babel-preset-typescript-vue3/-/babel-preset-typescript-vue3-2.0.17.tgz#632111a4e91535f238ecaa1c08dbee4e1b3c10ad"
- integrity sha512-6AdNf72Jd9OTap9ws12bAehn/GuuBSqUPN+nuOY7XCMckRcvPbO1G+yFvF+ahQsiMCk+gUZwTie1eoQMzeesog==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/plugin-transform-typescript" "^7.3.2"
- "@babel/preset-typescript" "^7.3.3"
- "@vue/compiler-sfc" "^3.0.5"
-
-backoff@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f"
- integrity sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==
- dependencies:
- precond "0.2"
-
-balanced-match@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
- integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-
-balanced-match@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9"
- integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==
-
-base64-js@^1.3.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
- integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-
-base64id@2.0.0, base64id@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6"
- integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==
-
-bcryptjs@2.4.3:
- version "2.4.3"
- resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
- integrity sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==
-
-big.js@^5.2.2:
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
- integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
-
-binary-extensions@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
- integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
-
-bindings@^1.5.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
- integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
- dependencies:
- file-uri-to-path "1.0.0"
-
-bl@^4.0.3:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
- integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
- dependencies:
- buffer "^5.5.0"
- inherits "^2.0.4"
- readable-stream "^3.4.0"
-
-bn.js@^4.0.0:
- version "4.12.0"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
- integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
-
-body-parser@1.20.3:
- version "1.20.3"
- resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6"
- integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==
- dependencies:
- bytes "3.1.2"
- content-type "~1.0.5"
- debug "2.6.9"
- depd "2.0.0"
- destroy "1.2.0"
- http-errors "2.0.0"
- iconv-lite "0.4.24"
- on-finished "2.4.1"
- qs "6.13.0"
- raw-body "2.5.2"
- type-is "~1.6.18"
- unpipe "1.0.0"
-
-boolbase@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
- integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
-
-brace-expansion@^1.1.7:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
- integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
- dependencies:
- balanced-match "^1.0.0"
- concat-map "0.0.1"
-
-brace-expansion@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
- integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
- dependencies:
- balanced-match "^1.0.0"
-
-braces@^3.0.2, braces@~3.0.2:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
- integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
- dependencies:
- fill-range "^7.1.1"
-
-browser-stdout@1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
- integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
-
-browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.19.1, browserslist@^4.20.2, browserslist@^4.20.3, browserslist@^4.21.2:
- version "4.21.2"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.2.tgz#59a400757465535954946a400b841ed37e2b4ecf"
- integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==
- dependencies:
- caniuse-lite "^1.0.30001366"
- electron-to-chromium "^1.4.188"
- node-releases "^2.0.6"
- update-browserslist-db "^1.0.4"
-
-browserslist@^4.21.10:
- version "4.23.3"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800"
- integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==
- dependencies:
- caniuse-lite "^1.0.30001646"
- electron-to-chromium "^1.5.4"
- node-releases "^2.0.18"
- update-browserslist-db "^1.1.0"
-
-buffer-equal-constant-time@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
- integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==
-
-buffer-from@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
- integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-
-buffer@^5.5.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
- integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
- dependencies:
- base64-js "^1.3.1"
- ieee754 "^1.1.13"
-
-buffer@^6.0.3:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
- integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
- dependencies:
- base64-js "^1.3.1"
- ieee754 "^1.2.1"
-
-bytes@3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
- integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
-
-cacache@^15.2.0:
- version "15.3.0"
- resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb"
- integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==
- dependencies:
- "@npmcli/fs" "^1.0.0"
- "@npmcli/move-file" "^1.0.1"
- chownr "^2.0.0"
- fs-minipass "^2.0.0"
- glob "^7.1.4"
- infer-owner "^1.0.4"
- lru-cache "^6.0.0"
- minipass "^3.1.1"
- minipass-collect "^1.0.2"
- minipass-flush "^1.0.5"
- minipass-pipeline "^1.2.2"
- mkdirp "^1.0.3"
- p-map "^4.0.0"
- promise-inflight "^1.0.1"
- rimraf "^3.0.2"
- ssri "^8.0.1"
- tar "^6.0.2"
- unique-filename "^1.1.1"
-
-cacheable-lookup@^5.0.3:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
- integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
-
-cacheable-request@^7.0.2:
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27"
- integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==
- dependencies:
- clone-response "^1.0.2"
- get-stream "^5.1.0"
- http-cache-semantics "^4.0.0"
- keyv "^4.0.0"
- lowercase-keys "^2.0.0"
- normalize-url "^6.0.1"
- responselike "^2.0.0"
-
-caching-transform@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f"
- integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==
- dependencies:
- hasha "^5.0.0"
- make-dir "^3.0.0"
- package-hash "^4.0.0"
- write-file-atomic "^3.0.0"
-
-call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
- integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
- dependencies:
- es-define-property "^1.0.0"
- es-errors "^1.3.0"
- function-bind "^1.1.2"
- get-intrinsic "^1.2.4"
- set-function-length "^1.2.1"
-
-callsites@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
- integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-
-camelcase-keys@^6.2.2:
- version "6.2.2"
- resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
- integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
- dependencies:
- camelcase "^5.3.1"
- map-obj "^4.0.0"
- quick-lru "^4.0.1"
-
-camelcase@^5.0.0, camelcase@^5.3.1:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
- integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
-
-camelcase@^6.0.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
- integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
-
-caniuse-api@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
- integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
- dependencies:
- browserslist "^4.0.0"
- caniuse-lite "^1.0.0"
- lodash.memoize "^4.1.2"
- lodash.uniq "^4.5.0"
-
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001335, caniuse-lite@^1.0.30001366:
- version "1.0.30001641"
- resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz"
- integrity sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==
-
-caniuse-lite@^1.0.30001646:
- version "1.0.30001655"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz#0ce881f5a19a2dcfda2ecd927df4d5c1684b982f"
- integrity sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==
-
-chai@4.3.7:
- version "4.3.7"
- resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51"
- integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==
- dependencies:
- assertion-error "^1.1.0"
- check-error "^1.0.2"
- deep-eql "^4.1.2"
- get-func-name "^2.0.0"
- loupe "^2.3.1"
- pathval "^1.1.1"
- type-detect "^4.0.5"
-
-chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
- integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
- dependencies:
- ansi-styles "^4.1.0"
- supports-color "^7.1.0"
-
-chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
- version "2.4.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
- integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
- dependencies:
- ansi-styles "^3.2.1"
- escape-string-regexp "^1.0.5"
- supports-color "^5.3.0"
-
-chalk@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
- integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
- dependencies:
- ansi-styles "^4.1.0"
- supports-color "^7.1.0"
-
-check-error@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
- integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==
-
-cheerio-select@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4"
- integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==
- dependencies:
- boolbase "^1.0.0"
- css-select "^5.1.0"
- css-what "^6.1.0"
- domelementtype "^2.3.0"
- domhandler "^5.0.3"
- domutils "^3.0.1"
-
-cheerio@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0.tgz#1ede4895a82f26e8af71009f961a9b8cb60d6a81"
- integrity sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==
- dependencies:
- cheerio-select "^2.1.0"
- dom-serializer "^2.0.0"
- domhandler "^5.0.3"
- domutils "^3.1.0"
- encoding-sniffer "^0.2.0"
- htmlparser2 "^9.1.0"
- parse5 "^7.1.2"
- parse5-htmlparser2-tree-adapter "^7.0.0"
- parse5-parser-stream "^7.1.2"
- undici "^6.19.5"
- whatwg-mimetype "^4.0.0"
-
-chokidar@3.5.3, chokidar@^3.5.3:
- version "3.5.3"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
- integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
- 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"
- optionalDependencies:
- fsevents "~2.3.2"
-
-chownr@^1.1.1:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
- integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
-
-chownr@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
- integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
-
-chrome-trace-event@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
- integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
-
-clean-stack@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
- integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
-
-cliui@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
- integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
- dependencies:
- string-width "^4.2.0"
- strip-ansi "^6.0.0"
- wrap-ansi "^6.2.0"
-
-cliui@^7.0.2:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
- integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
- dependencies:
- string-width "^4.2.0"
- strip-ansi "^6.0.0"
- wrap-ansi "^7.0.0"
-
-clone-deep@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
- integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
- dependencies:
- is-plain-object "^2.0.4"
- kind-of "^6.0.2"
- shallow-clone "^3.0.0"
-
-clone-regexp@^2.1.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f"
- integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==
- dependencies:
- is-regexp "^2.0.0"
-
-clone-response@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3"
- integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==
- dependencies:
- mimic-response "^1.0.0"
-
-color-convert@^1.9.0:
- version "1.9.3"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
- integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
- dependencies:
- color-name "1.1.3"
-
-color-convert@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
- integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
- dependencies:
- color-name "~1.1.4"
-
-color-name@1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
- integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
-
-color-name@~1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
- integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-
-color-support@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
- integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
-
-colord@^2.9.1, colord@^2.9.2:
- version "2.9.2"
- resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1"
- integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==
-
-colorette@^2.0.10, colorette@^2.0.14:
- version "2.0.19"
- resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
- integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
-
-commander@9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-9.0.0.tgz#86d58f24ee98126568936bd1d3574e0308a99a40"
- integrity sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==
-
-commander@^10.0.0:
- version "10.0.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
- integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
-
-commander@^2.20.0:
- version "2.20.3"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
- integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-
-commander@^7.0.0, commander@^7.2.0:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
- integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
-
-commondir@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
- integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
-
-compress-brotli@^1.3.8:
- version "1.3.8"
- resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.8.tgz#0c0a60c97a989145314ec381e84e26682e7b38db"
- integrity sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==
- dependencies:
- "@types/json-buffer" "~3.0.0"
- json-buffer "~3.0.1"
-
-concat-map@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
- integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
-
-config-chain@^1.1.13:
- version "1.1.13"
- resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
- integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
- dependencies:
- ini "^1.3.4"
- proto-list "~1.2.1"
-
-console-control-strings@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
- integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
-
-content-disposition@0.5.4:
- version "0.5.4"
- resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
- integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
- dependencies:
- safe-buffer "5.2.1"
-
-content-type@~1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
- integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
-
-content-type@~1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
- integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
-
-convert-source-map@^1.7.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
- integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
- dependencies:
- safe-buffer "~5.1.1"
-
-cookie-signature@1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
- integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
-
-cookie@0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
- integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
-
-cookie@~0.4.1:
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
- integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
-
-copy-webpack-plugin@10.2.4:
- version "10.2.4"
- resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe"
- integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==
- dependencies:
- fast-glob "^3.2.7"
- glob-parent "^6.0.1"
- globby "^12.0.2"
- normalize-path "^3.0.0"
- schema-utils "^4.0.0"
- serialize-javascript "^6.0.0"
-
-core-js-compat@^3.21.0, core-js-compat@^3.22.1:
- version "3.23.5"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.23.5.tgz#11edce2f1c4f69a96d30ce77c805ce118909cd5b"
- integrity sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg==
- dependencies:
- browserslist "^4.21.2"
- semver "7.0.0"
-
-core-js@^3.38.1:
- version "3.38.1"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.38.1.tgz#aa375b79a286a670388a1a363363d53677c0383e"
- integrity sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==
-
-core-util-is@1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
- integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==
-
-cors@~2.8.5:
- version "2.8.5"
- resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
- integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
- dependencies:
- object-assign "^4"
- vary "^1"
-
-cosmiconfig@^7.0.0, cosmiconfig@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
- integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
- 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"
-
-create-require@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
- integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
-
-cross-env@7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
- integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
- dependencies:
- cross-spawn "^7.0.1"
-
-cross-spawn@^6.0.5:
- version "6.0.5"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
- integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
- dependencies:
- nice-try "^1.0.4"
- path-key "^2.0.1"
- semver "^5.5.0"
- shebang-command "^1.2.0"
- which "^1.2.9"
-
-cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-css-blank-pseudo@^3.0.2:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561"
- integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==
- dependencies:
- postcss-selector-parser "^6.0.9"
-
-css-declaration-sorter@^6.3.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz#72ebd995c8f4532ff0036631f7365cce9759df14"
- integrity sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==
-
-css-has-pseudo@^3.0.3:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73"
- integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==
- dependencies:
- postcss-selector-parser "^6.0.9"
-
-css-loader@6.5.1:
- version "6.5.1"
- resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.5.1.tgz#0c43d4fbe0d97f699c91e9818cb585759091d1b1"
- integrity sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==
- dependencies:
- icss-utils "^5.1.0"
- postcss "^8.2.15"
- postcss-modules-extract-imports "^3.0.0"
- postcss-modules-local-by-default "^4.0.0"
- postcss-modules-scope "^3.0.0"
- postcss-modules-values "^4.0.0"
- postcss-value-parser "^4.1.0"
- semver "^7.3.5"
-
-css-prefers-color-scheme@^6.0.3:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349"
- integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==
-
-css-select@^4.1.3:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b"
- integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==
- dependencies:
- boolbase "^1.0.0"
- css-what "^6.0.1"
- domhandler "^4.3.1"
- domutils "^2.8.0"
- nth-check "^2.0.1"
-
-css-select@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6"
- integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==
- dependencies:
- boolbase "^1.0.0"
- css-what "^6.1.0"
- domhandler "^5.0.2"
- domutils "^3.0.1"
- nth-check "^2.0.1"
-
-css-tree@^1.1.2, css-tree@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
- integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
- dependencies:
- mdn-data "2.0.14"
- source-map "^0.6.1"
-
-css-what@^6.0.1, css-what@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
- integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
-
-cssdb@^6.1.0:
- version "6.6.3"
- resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-6.6.3.tgz#1f331a2fab30c18d9f087301e6122a878bb1e505"
- integrity sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==
-
-cssesc@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
- integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
-
-cssnano-preset-default@^5.1.12:
- version "5.2.12"
- resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz#ebe6596ec7030e62c3eb2b3c09f533c0644a9a97"
- integrity sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==
- dependencies:
- css-declaration-sorter "^6.3.0"
- cssnano-utils "^3.1.0"
- postcss-calc "^8.2.3"
- postcss-colormin "^5.3.0"
- postcss-convert-values "^5.1.2"
- postcss-discard-comments "^5.1.2"
- postcss-discard-duplicates "^5.1.0"
- postcss-discard-empty "^5.1.1"
- postcss-discard-overridden "^5.1.0"
- postcss-merge-longhand "^5.1.6"
- postcss-merge-rules "^5.1.2"
- postcss-minify-font-values "^5.1.0"
- postcss-minify-gradients "^5.1.1"
- postcss-minify-params "^5.1.3"
- postcss-minify-selectors "^5.2.1"
- postcss-normalize-charset "^5.1.0"
- postcss-normalize-display-values "^5.1.0"
- postcss-normalize-positions "^5.1.1"
- postcss-normalize-repeat-style "^5.1.1"
- postcss-normalize-string "^5.1.0"
- postcss-normalize-timing-functions "^5.1.0"
- postcss-normalize-unicode "^5.1.0"
- postcss-normalize-url "^5.1.0"
- postcss-normalize-whitespace "^5.1.1"
- postcss-ordered-values "^5.1.3"
- postcss-reduce-initial "^5.1.0"
- postcss-reduce-transforms "^5.1.0"
- postcss-svgo "^5.1.0"
- postcss-unique-selectors "^5.1.1"
-
-cssnano-utils@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861"
- integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==
-
-cssnano@5.0.17:
- version "5.0.17"
- resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.17.tgz#ff45713c05cfc780a1aeb3e663b6f224d091cabf"
- integrity sha512-fmjLP7k8kL18xSspeXTzRhaFtRI7DL9b8IcXR80JgtnWBpvAzHT7sCR/6qdn0tnxIaINUN6OEQu83wF57Gs3Xw==
- dependencies:
- cssnano-preset-default "^5.1.12"
- lilconfig "^2.0.3"
- yaml "^1.10.2"
-
-csso@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
- integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
- dependencies:
- css-tree "^1.1.2"
-
-csstype@^2.6.8:
- version "2.6.20"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda"
- integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==
-
-data-view-buffer@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2"
- integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==
- dependencies:
- call-bind "^1.0.6"
- es-errors "^1.3.0"
- is-data-view "^1.0.1"
-
-data-view-byte-length@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2"
- integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==
- dependencies:
- call-bind "^1.0.7"
- es-errors "^1.3.0"
- is-data-view "^1.0.1"
-
-data-view-byte-offset@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a"
- integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==
- dependencies:
- call-bind "^1.0.6"
- es-errors "^1.3.0"
- is-data-view "^1.0.1"
-
-dayjs@1.10.8:
- version "1.10.8"
- resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.8.tgz#267df4bc6276fcb33c04a6735287e3f429abec41"
- integrity sha512-wbNwDfBHHur9UOzNUjeKUOJ0fCb0a52Wx0xInmQ7Y8FstyajiV1NmK1e00cxsr9YrE9r7yAChE0VvpuY5Rnlow==
-
-debug@2.6.9:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
-debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
- integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
- dependencies:
- ms "2.1.2"
-
-debug@4.3.3:
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
- integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
- dependencies:
- ms "2.1.2"
-
-decamelize-keys@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
- integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==
- dependencies:
- decamelize "^1.1.0"
- map-obj "^1.0.0"
-
-decamelize@^1.1.0, decamelize@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
- integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
-
-decamelize@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
- integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
-
-decompress-response@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
- integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
- dependencies:
- mimic-response "^3.1.0"
-
-deep-eql@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.2.tgz#270ceb902f87724077e6f6449aed81463f42fc1c"
- integrity sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==
- dependencies:
- type-detect "^4.0.0"
-
-deep-extend@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
- integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
-
-deep-is@^0.1.3:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
- integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
-
-deepmerge@^4.2.2:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
- integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
-
-default-require-extensions@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96"
- integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==
- dependencies:
- strip-bom "^4.0.0"
-
-defer-to-connect@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587"
- integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
-
-define-data-property@^1.0.1, define-data-property@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
- integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
- dependencies:
- es-define-property "^1.0.0"
- es-errors "^1.3.0"
- gopd "^1.0.1"
-
-define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
- integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
- dependencies:
- define-data-property "^1.0.1"
- has-property-descriptors "^1.0.0"
- object-keys "^1.1.1"
-
-delegates@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
- integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
-
-depd@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
- integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-
-depd@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
- integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
-
-destroy@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
- integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
-
-detect-libc@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd"
- integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==
-
-diff@5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
- integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
-
-diff@^4.0.1, diff@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
- integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
-
-diff@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40"
- integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==
-
-dir-glob@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
- integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
- dependencies:
- path-type "^4.0.0"
-
-doctrine@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
- integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
- dependencies:
- esutils "^2.0.2"
-
-dom-serializer@^1.0.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30"
- integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==
- dependencies:
- domelementtype "^2.0.1"
- domhandler "^4.2.0"
- entities "^2.0.0"
-
-dom-serializer@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53"
- integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
- dependencies:
- domelementtype "^2.3.0"
- domhandler "^5.0.2"
- entities "^4.2.0"
-
-domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
- integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
-
-domhandler@^4.2.0, domhandler@^4.3.1:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
- integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
- dependencies:
- domelementtype "^2.2.0"
-
-domhandler@^5.0.2, domhandler@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
- integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
- dependencies:
- domelementtype "^2.3.0"
-
-domutils@^2.8.0:
- version "2.8.0"
- resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
- integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
- dependencies:
- dom-serializer "^1.0.1"
- domelementtype "^2.2.0"
- domhandler "^4.2.0"
-
-domutils@^3.0.1, domutils@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e"
- integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==
- dependencies:
- dom-serializer "^2.0.0"
- domelementtype "^2.3.0"
- domhandler "^5.0.3"
-
-eastasianwidth@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
- integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
-
-ecdsa-sig-formatter@1.0.11:
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
- integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
- dependencies:
- safe-buffer "^5.0.1"
-
-editorconfig@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-1.0.4.tgz#040c9a8e9a6c5288388b87c2db07028aa89f53a3"
- integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==
- dependencies:
- "@one-ini/wasm" "0.1.1"
- commander "^10.0.0"
- minimatch "9.0.1"
- semver "^7.5.3"
-
-ee-first@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
- integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
-
-electron-to-chromium@^1.4.188:
- version "1.4.199"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.199.tgz#e0384fde79fdda89880e8be58196a9153e04db3b"
- integrity sha512-WIGME0Cs7oob3mxsJwHbeWkH0tYkIE/sjkJ8ML2BYmuRcjhRl/q5kVDXG7W9LOOKwzPU5M0LBlXRq9rlSgnNlg==
-
-electron-to-chromium@^1.5.4:
- version "1.5.13"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz#1abf0410c5344b2b829b7247e031f02810d442e6"
- integrity sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==
-
-emoji-regex@10.2.1:
- version "10.2.1"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.2.1.tgz#a41c330d957191efd3d9dfe6e1e8e1e9ab048b3f"
- integrity sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==
-
-emoji-regex@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
- integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-
-emoji-regex@^9.2.2:
- version "9.2.2"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
- integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
-
-emojis-list@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
- integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
-
-encodeurl@~1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
- integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
-
-encodeurl@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
- integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
-
-encoding-sniffer@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz#799569d66d443babe82af18c9f403498365ef1d5"
- integrity sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==
- dependencies:
- iconv-lite "^0.6.3"
- whatwg-encoding "^3.1.1"
-
-encoding@^0.1.12:
- version "0.1.13"
- resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
- integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
- dependencies:
- iconv-lite "^0.6.2"
-
-end-of-stream@^1.1.0, end-of-stream@^1.4.1:
- version "1.4.4"
- resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
- integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
- dependencies:
- once "^1.4.0"
-
-engine.io-client@~6.2.1:
- version "6.2.3"
- resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.2.3.tgz#a8cbdab003162529db85e9de31575097f6d29458"
- integrity sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==
- dependencies:
- "@socket.io/component-emitter" "~3.1.0"
- debug "~4.3.1"
- engine.io-parser "~5.0.3"
- ws "~8.2.3"
- xmlhttprequest-ssl "~2.0.0"
-
-engine.io-parser@~5.0.3:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0"
- integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==
-
-engine.io@~6.4.2:
- version "6.4.2"
- resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.4.2.tgz#ffeaf68f69b1364b0286badddf15ff633476473f"
- integrity sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==
- dependencies:
- "@types/cookie" "^0.4.1"
- "@types/cors" "^2.8.12"
- "@types/node" ">=10.0.0"
- accepts "~1.3.4"
- base64id "2.0.0"
- cookie "~0.4.1"
- cors "~2.8.5"
- debug "~4.3.1"
- engine.io-parser "~5.0.3"
- ws "~8.11.0"
-
-enhanced-resolve@^5.0.0, enhanced-resolve@^5.9.3:
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6"
- integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==
- dependencies:
- graceful-fs "^4.2.4"
- tapable "^2.2.0"
-
-enhanced-resolve@^5.17.1:
- version "5.17.1"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15"
- integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==
- dependencies:
- graceful-fs "^4.2.4"
- tapable "^2.2.0"
-
-entities@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
- integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
-
-entities@^4.2.0, entities@^4.4.0, entities@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
- integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
-
-env-paths@^2.2.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
- integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
-
-envinfo@^7.7.3:
- version "7.8.1"
- resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
- integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
-
-err-code@^2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9"
- integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==
-
-error-ex@^1.3.1:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
- integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
- dependencies:
- is-arrayish "^0.2.1"
-
-es-abstract@^1.19.1:
- version "1.20.1"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814"
- integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==
- dependencies:
- call-bind "^1.0.2"
- es-to-primitive "^1.2.1"
- function-bind "^1.1.1"
- function.prototype.name "^1.1.5"
- get-intrinsic "^1.1.1"
- get-symbol-description "^1.0.0"
- has "^1.0.3"
- has-property-descriptors "^1.0.0"
- has-symbols "^1.0.3"
- internal-slot "^1.0.3"
- is-callable "^1.2.4"
- is-negative-zero "^2.0.2"
- is-regex "^1.1.4"
- is-shared-array-buffer "^1.0.2"
- is-string "^1.0.7"
- is-weakref "^1.0.2"
- object-inspect "^1.12.0"
- object-keys "^1.1.1"
- object.assign "^4.1.2"
- regexp.prototype.flags "^1.4.3"
- string.prototype.trimend "^1.0.5"
- string.prototype.trimstart "^1.0.5"
- unbox-primitive "^1.0.2"
-
-es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0:
- version "1.23.3"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
- integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
- dependencies:
- array-buffer-byte-length "^1.0.1"
- arraybuffer.prototype.slice "^1.0.3"
- available-typed-arrays "^1.0.7"
- call-bind "^1.0.7"
- data-view-buffer "^1.0.1"
- data-view-byte-length "^1.0.1"
- data-view-byte-offset "^1.0.0"
- es-define-property "^1.0.0"
- es-errors "^1.3.0"
- es-object-atoms "^1.0.0"
- es-set-tostringtag "^2.0.3"
- es-to-primitive "^1.2.1"
- function.prototype.name "^1.1.6"
- get-intrinsic "^1.2.4"
- get-symbol-description "^1.0.2"
- globalthis "^1.0.3"
- gopd "^1.0.1"
- has-property-descriptors "^1.0.2"
- has-proto "^1.0.3"
- has-symbols "^1.0.3"
- hasown "^2.0.2"
- internal-slot "^1.0.7"
- is-array-buffer "^3.0.4"
- is-callable "^1.2.7"
- is-data-view "^1.0.1"
- is-negative-zero "^2.0.3"
- is-regex "^1.1.4"
- is-shared-array-buffer "^1.0.3"
- is-string "^1.0.7"
- is-typed-array "^1.1.13"
- is-weakref "^1.0.2"
- object-inspect "^1.13.1"
- object-keys "^1.1.1"
- object.assign "^4.1.5"
- regexp.prototype.flags "^1.5.2"
- safe-array-concat "^1.1.2"
- safe-regex-test "^1.0.3"
- string.prototype.trim "^1.2.9"
- string.prototype.trimend "^1.0.8"
- string.prototype.trimstart "^1.0.8"
- typed-array-buffer "^1.0.2"
- typed-array-byte-length "^1.0.1"
- typed-array-byte-offset "^1.0.2"
- typed-array-length "^1.0.6"
- unbox-primitive "^1.0.2"
- which-typed-array "^1.1.15"
-
-es-define-property@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
- integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
- dependencies:
- get-intrinsic "^1.2.4"
-
-es-errors@^1.2.1, es-errors@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
- integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
-
-es-module-lexer@^0.9.0:
- version "0.9.3"
- resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
- integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
-
-es-module-lexer@^1.2.1:
- version "1.5.4"
- resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78"
- integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==
-
-es-object-atoms@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941"
- integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
- dependencies:
- es-errors "^1.3.0"
-
-es-set-tostringtag@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
- integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
- dependencies:
- get-intrinsic "^1.2.4"
- has-tostringtag "^1.0.2"
- hasown "^2.0.1"
-
-es-to-primitive@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
- integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
- dependencies:
- is-callable "^1.1.4"
- is-date-object "^1.0.1"
- is-symbol "^1.0.2"
-
-es6-error@^4.0.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
- integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
-
-escalade@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
- integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
-
-escalade@^3.1.2:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
- integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
-
-escape-html@~1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
- integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
-
-escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
- integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
-
-escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
- integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
-
-eslint-config-prettier@9.1.0:
- version "9.1.0"
- resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f"
- integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==
-
-eslint-define-config@2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/eslint-define-config/-/eslint-define-config-2.1.0.tgz#9708b3efd57637b6fb685d9c2fb6285b9acfbd71"
- integrity sha512-QUp6pM9pjKEVannNAbSJNeRuYwW3LshejfyBBpjeMGaJjaDUpVps4C6KVR8R7dWZnD3i0synmrE36znjTkJvdQ==
-
-eslint-plugin-vue@9.25.0:
- version "9.25.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz#615cb7bb6d0e2140d21840b9aa51dce69e803e7a"
- integrity sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==
- dependencies:
- "@eslint-community/eslint-utils" "^4.4.0"
- globals "^13.24.0"
- natural-compare "^1.4.0"
- nth-check "^2.1.1"
- postcss-selector-parser "^6.0.15"
- semver "^7.6.0"
- vue-eslint-parser "^9.4.2"
- xml-name-validator "^4.0.0"
-
-eslint-scope@5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
- integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
- dependencies:
- esrecurse "^4.3.0"
- estraverse "^4.1.1"
-
-eslint-scope@^7.1.1:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
- integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
- dependencies:
- esrecurse "^4.3.0"
- estraverse "^5.2.0"
-
-eslint-scope@^7.2.2:
- version "7.2.2"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
- integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
- dependencies:
- esrecurse "^4.3.0"
- estraverse "^5.2.0"
-
-eslint-visitor-keys@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
- integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
-
-eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
- version "3.4.3"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
- integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
-
-eslint@8.57.0:
- version "8.57.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668"
- integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==
- dependencies:
- "@eslint-community/eslint-utils" "^4.2.0"
- "@eslint-community/regexpp" "^4.6.1"
- "@eslint/eslintrc" "^2.1.4"
- "@eslint/js" "8.57.0"
- "@humanwhocodes/config-array" "^0.11.14"
- "@humanwhocodes/module-importer" "^1.0.1"
- "@nodelib/fs.walk" "^1.2.8"
- "@ungap/structured-clone" "^1.2.0"
- ajv "^6.12.4"
- chalk "^4.0.0"
- cross-spawn "^7.0.2"
- debug "^4.3.2"
- doctrine "^3.0.0"
- escape-string-regexp "^4.0.0"
- eslint-scope "^7.2.2"
- eslint-visitor-keys "^3.4.3"
- espree "^9.6.1"
- esquery "^1.4.2"
- esutils "^2.0.2"
- fast-deep-equal "^3.1.3"
- file-entry-cache "^6.0.1"
- find-up "^5.0.0"
- glob-parent "^6.0.2"
- globals "^13.19.0"
- graphemer "^1.4.0"
- ignore "^5.2.0"
- imurmurhash "^0.1.4"
- is-glob "^4.0.0"
- is-path-inside "^3.0.3"
- js-yaml "^4.1.0"
- json-stable-stringify-without-jsonify "^1.0.1"
- levn "^0.4.1"
- lodash.merge "^4.6.2"
- minimatch "^3.1.2"
- natural-compare "^1.4.0"
- optionator "^0.9.3"
- strip-ansi "^6.0.1"
- text-table "^0.2.0"
-
-espree@^9.3.1:
- version "9.3.2"
- resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596"
- integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==
- dependencies:
- acorn "^8.7.1"
- acorn-jsx "^5.3.2"
- eslint-visitor-keys "^3.3.0"
-
-espree@^9.6.0, espree@^9.6.1:
- version "9.6.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
- integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
- dependencies:
- acorn "^8.9.0"
- acorn-jsx "^5.3.2"
- eslint-visitor-keys "^3.4.1"
-
-esprima@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
- integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-
-esquery@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
- integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
- dependencies:
- estraverse "^5.1.0"
-
-esquery@^1.4.2:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
- integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
- dependencies:
- estraverse "^5.1.0"
-
-esrecurse@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
- integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
- dependencies:
- estraverse "^5.2.0"
-
-estraverse@^4.1.1:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
- integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
-
-estraverse@^5.1.0, estraverse@^5.2.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
- integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
-
-estree-walker@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
- integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
-
-esutils@^2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
- integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
-
-etag@~1.8.1:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
- integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
-
-eventemitter3@^4.0.4:
- version "4.0.7"
- resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
- integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
-
-eventemitter3@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4"
- integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==
-
-events@^3.2.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
- integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
-
-execa@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a"
- integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==
- dependencies:
- cross-spawn "^7.0.0"
- get-stream "^5.0.0"
- human-signals "^1.1.1"
- is-stream "^2.0.0"
- merge-stream "^2.0.0"
- npm-run-path "^4.0.0"
- onetime "^5.1.0"
- signal-exit "^3.0.2"
- strip-final-newline "^2.0.0"
-
-execa@^5.0.0:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
- integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
- dependencies:
- cross-spawn "^7.0.3"
- get-stream "^6.0.0"
- human-signals "^2.1.0"
- is-stream "^2.0.0"
- merge-stream "^2.0.0"
- npm-run-path "^4.0.1"
- onetime "^5.1.2"
- signal-exit "^3.0.3"
- strip-final-newline "^2.0.0"
-
-execall@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45"
- integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==
- dependencies:
- clone-regexp "^2.1.0"
-
-expand-template@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
- integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
-
-express@4.20.0:
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/express/-/express-4.20.0.tgz#f1d08e591fcec770c07be4767af8eb9bcfd67c48"
- integrity sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==
- dependencies:
- accepts "~1.3.8"
- array-flatten "1.1.1"
- body-parser "1.20.3"
- content-disposition "0.5.4"
- content-type "~1.0.4"
- cookie "0.6.0"
- cookie-signature "1.0.6"
- debug "2.6.9"
- depd "2.0.0"
- encodeurl "~2.0.0"
- escape-html "~1.0.3"
- etag "~1.8.1"
- finalhandler "1.2.0"
- fresh "0.5.2"
- http-errors "2.0.0"
- merge-descriptors "1.0.3"
- methods "~1.1.2"
- on-finished "2.4.1"
- parseurl "~1.3.3"
- path-to-regexp "0.1.10"
- proxy-addr "~2.0.7"
- qs "6.11.0"
- range-parser "~1.2.1"
- safe-buffer "5.2.1"
- send "0.19.0"
- serve-static "1.16.0"
- setprototypeof "1.2.0"
- statuses "2.0.1"
- type-is "~1.6.18"
- utils-merge "1.0.1"
- vary "~1.1.2"
-
-extsprintf@^1.2.0:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
- integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
-
-fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
- integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-
-fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9:
- version "3.2.11"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
- integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
- dependencies:
- "@nodelib/fs.stat" "^2.0.2"
- "@nodelib/fs.walk" "^1.2.3"
- glob-parent "^5.1.2"
- merge2 "^1.3.0"
- micromatch "^4.0.4"
-
-fast-json-stable-stringify@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
- integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-
-fast-levenshtein@^2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
- integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
-
-fast-text-encoding@^1.0.0:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867"
- integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==
-
-fastest-levenshtein@^1.0.12:
- version "1.0.14"
- resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz#9054384e4b7a78c88d01a4432dc18871af0ac859"
- integrity sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA==
-
-fastq@^1.6.0:
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
- integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
- dependencies:
- reusify "^1.0.4"
-
-file-entry-cache@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
- integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
- dependencies:
- flat-cache "^3.0.4"
-
-file-type@16.5.4:
- version "16.5.4"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.4.tgz#474fb4f704bee427681f98dd390058a172a6c2fd"
- integrity sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==
- dependencies:
- readable-web-to-node-stream "^3.0.0"
- strtok3 "^6.2.4"
- token-types "^4.1.1"
-
-file-uri-to-path@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
- integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
-
-filename-reserved-regex@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229"
- integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==
-
-filenamify@4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106"
- integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==
- dependencies:
- filename-reserved-regex "^2.0.0"
- strip-outer "^1.0.1"
- trim-repeated "^1.0.0"
-
-fill-range@^7.1.1:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
- integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
- dependencies:
- to-regex-range "^5.0.1"
-
-finalhandler@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
- integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
- dependencies:
- debug "2.6.9"
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- on-finished "2.4.1"
- parseurl "~1.3.3"
- statuses "2.0.1"
- unpipe "~1.0.0"
-
-find-cache-dir@^3.2.0, find-cache-dir@^3.3.1:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
- integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
- dependencies:
- commondir "^1.0.1"
- make-dir "^3.0.2"
- pkg-dir "^4.1.0"
-
-find-up@5.0.0, find-up@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
- integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
- dependencies:
- locate-path "^6.0.0"
- path-exists "^4.0.0"
-
-find-up@^4.0.0, find-up@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
- integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
- dependencies:
- locate-path "^5.0.0"
- path-exists "^4.0.0"
-
-flat-cache@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
- integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
- dependencies:
- flatted "^3.1.0"
- rimraf "^3.0.2"
-
-flat@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
- integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
-
-flatted@^3.1.0:
- version "3.2.6"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2"
- integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==
-
-for-each@^0.3.3:
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
- integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
- dependencies:
- is-callable "^1.1.3"
-
-foreground-child@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53"
- integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==
- dependencies:
- cross-spawn "^7.0.0"
- signal-exit "^3.0.2"
-
-foreground-child@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d"
- integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==
- dependencies:
- cross-spawn "^7.0.0"
- signal-exit "^4.0.1"
-
-fork-ts-checker-webpack-plugin@7.2.13:
- version "7.2.13"
- resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz#51ffd6a2f96f03ab64b92f8aedf305dbf3dee0f1"
- integrity sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==
- dependencies:
- "@babel/code-frame" "^7.16.7"
- chalk "^4.1.2"
- chokidar "^3.5.3"
- cosmiconfig "^7.0.1"
- deepmerge "^4.2.2"
- fs-extra "^10.0.0"
- memfs "^3.4.1"
- minimatch "^3.0.4"
- node-abort-controller "^3.0.1"
- schema-utils "^3.1.1"
- semver "^7.3.5"
- tapable "^2.2.1"
-
-forwarded@0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
- integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
-
-fraction.js@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950"
- integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==
-
-fresh@0.5.2:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
- integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
-
-fromentries@^1.2.0:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a"
- integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==
-
-fs-constants@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
- integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
-
-fs-extra@^10.0.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
- integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
- dependencies:
- graceful-fs "^4.2.0"
- jsonfile "^6.0.1"
- universalify "^2.0.0"
-
-fs-minipass@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
- integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
- dependencies:
- minipass "^3.0.0"
-
-fs-monkey@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3"
- integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==
-
-fs.realpath@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
- integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
-
-fsevents@~2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
- integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
-
-function-bind@^1.1.1, function-bind@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
- integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
-
-function.prototype.name@^1.1.5, function.prototype.name@^1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
- integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
- dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
- functions-have-names "^1.2.3"
-
-functions-have-names@^1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
- integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
-
-fuzzy@0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/fuzzy/-/fuzzy-0.1.3.tgz#4c76ec2ff0ac1a36a9dccf9a00df8623078d4ed8"
- integrity sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==
-
-gauge@^4.0.3:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce"
- integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==
- dependencies:
- aproba "^1.0.3 || ^2.0.0"
- color-support "^1.1.3"
- console-control-strings "^1.1.0"
- has-unicode "^2.0.1"
- signal-exit "^3.0.7"
- string-width "^4.2.3"
- strip-ansi "^6.0.1"
- wide-align "^1.1.5"
-
-gensync@^1.0.0-beta.2:
- version "1.0.0-beta.2"
- resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
- integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
-
-get-caller-file@^2.0.1, get-caller-file@^2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
- integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-
-get-func-name@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41"
- integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==
-
-get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
- integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
- dependencies:
- es-errors "^1.3.0"
- function-bind "^1.1.2"
- has-proto "^1.0.1"
- has-symbols "^1.0.3"
- hasown "^2.0.0"
-
-get-package-type@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
- integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
-
-get-stdin@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53"
- integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==
-
-get-stream@^5.0.0, get-stream@^5.1.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
- integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
- dependencies:
- pump "^3.0.0"
-
-get-stream@^6.0.0:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
- integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
-
-get-symbol-description@^1.0.0, get-symbol-description@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5"
- integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==
- dependencies:
- call-bind "^1.0.5"
- es-errors "^1.3.0"
- get-intrinsic "^1.2.4"
-
-github-from-package@0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
- integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==
-
-glob-parent@^5.1.2, glob-parent@~5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
- integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
- dependencies:
- is-glob "^4.0.1"
-
-glob-parent@^6.0.1, glob-parent@^6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
- integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
- dependencies:
- is-glob "^4.0.3"
-
-glob-to-regexp@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
- integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
-
-glob@7.2.0:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
- integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
- 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"
-
-glob@^10.3.3:
- version "10.3.12"
- resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b"
- integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==
- dependencies:
- foreground-child "^3.1.0"
- jackspeak "^2.3.6"
- minimatch "^9.0.1"
- minipass "^7.0.4"
- path-scurry "^1.10.2"
-
-glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
- version "7.2.3"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
- integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.1.1"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-global-modules@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
- integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
- dependencies:
- global-prefix "^3.0.0"
-
-global-prefix@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
- integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
- dependencies:
- ini "^1.3.5"
- kind-of "^6.0.2"
- which "^1.3.1"
-
-globals@^11.1.0:
- version "11.12.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
- integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-
-globals@^13.19.0, globals@^13.24.0:
- version "13.24.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
- integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
- dependencies:
- type-fest "^0.20.2"
-
-globalthis@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
- integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
- dependencies:
- define-properties "^1.2.1"
- gopd "^1.0.1"
-
-globby@^11.1.0:
- version "11.1.0"
- resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
- integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
- dependencies:
- array-union "^2.1.0"
- dir-glob "^3.0.1"
- fast-glob "^3.2.9"
- ignore "^5.2.0"
- merge2 "^1.4.1"
- slash "^3.0.0"
-
-globby@^12.0.2:
- version "12.2.0"
- resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22"
- integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==
- dependencies:
- array-union "^3.0.1"
- dir-glob "^3.0.1"
- fast-glob "^3.2.7"
- ignore "^5.1.9"
- merge2 "^1.4.1"
- slash "^4.0.0"
-
-globjoin@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
- integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==
-
-gopd@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
- integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
- dependencies:
- get-intrinsic "^1.1.3"
-
-got@11.8.6:
- version "11.8.6"
- resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a"
- integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==
- dependencies:
- "@sindresorhus/is" "^4.0.0"
- "@szmarczak/http-timer" "^4.0.5"
- "@types/cacheable-request" "^6.0.1"
- "@types/responselike" "^1.0.0"
- cacheable-lookup "^5.0.3"
- cacheable-request "^7.0.2"
- decompress-response "^6.0.0"
- http2-wrapper "^1.0.0-beta.5.2"
- lowercase-keys "^2.0.0"
- p-cancelable "^2.0.0"
- responselike "^2.0.0"
-
-got@^11.8.2:
- version "11.8.5"
- resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046"
- integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==
- dependencies:
- "@sindresorhus/is" "^4.0.0"
- "@szmarczak/http-timer" "^4.0.5"
- "@types/cacheable-request" "^6.0.1"
- "@types/responselike" "^1.0.0"
- cacheable-lookup "^5.0.3"
- cacheable-request "^7.0.2"
- decompress-response "^6.0.0"
- http2-wrapper "^1.0.0-beta.5.2"
- lowercase-keys "^2.0.0"
- p-cancelable "^2.0.0"
- responselike "^2.0.0"
-
-graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9:
- version "4.2.10"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
- integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
-
-graceful-fs@^4.2.11:
- version "4.2.11"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
- integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
-
-grapheme-splitter@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
- integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
-
-graphemer@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
- integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
-
-growl@1.10.5:
- version "1.10.5"
- resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
- integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
-
-hard-rejection@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
- integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
-
-has-bigints@^1.0.1, has-bigints@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
- integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
-
-has-flag@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
- integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
-
-has-flag@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
- integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-
-has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
- integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
- dependencies:
- es-define-property "^1.0.0"
-
-has-proto@^1.0.1, has-proto@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
- integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
-
-has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
- integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
-
-has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
- integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
- dependencies:
- has-symbols "^1.0.3"
-
-has-unicode@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
- integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==
-
-has@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6"
- integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==
-
-hash-sum@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a"
- integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==
-
-hasha@^5.0.0:
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1"
- integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==
- dependencies:
- is-stream "^2.0.0"
- type-fest "^0.8.0"
-
-hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
- integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
- dependencies:
- function-bind "^1.1.2"
-
-he@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
- integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
-
-hosted-git-info@^2.1.4:
- version "2.8.9"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
- integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
-
-hosted-git-info@^4.0.1:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224"
- integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==
- dependencies:
- lru-cache "^6.0.0"
-
-html-entities@^2.1.0:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46"
- integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==
-
-html-escaper@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
- integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
-
-html-tags@^3.1.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961"
- integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==
-
-htmlparser2@^9.1.0:
- version "9.1.0"
- resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-9.1.0.tgz#cdb498d8a75a51f739b61d3f718136c369bc8c23"
- integrity sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==
- dependencies:
- domelementtype "^2.3.0"
- domhandler "^5.0.3"
- domutils "^3.1.0"
- entities "^4.5.0"
-
-http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
- integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
-
-http-errors@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
- integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
- dependencies:
- depd "2.0.0"
- inherits "2.0.4"
- setprototypeof "1.2.0"
- statuses "2.0.1"
- toidentifier "1.0.1"
-
-http-proxy-agent@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
- integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
- dependencies:
- "@tootallnate/once" "1"
- agent-base "6"
- debug "4"
-
-http2-wrapper@^1.0.0-beta.5.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
- integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==
- dependencies:
- quick-lru "^5.1.1"
- resolve-alpn "^1.0.0"
-
-http_ece@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.1.0.tgz#74780c6eb32d8ddfe9e36a83abcd81fe0cd4fb75"
- integrity sha512-bptAfCDdPJxOs5zYSe7Y3lpr772s1G346R4Td5LgRUeCwIGpCGDUTJxRrhTNcAXbx37spge0kWEIH7QAYWNTlA==
- dependencies:
- urlsafe-base64 "~1.0.0"
-
-https-proxy-agent@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
- integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
- dependencies:
- agent-base "6"
- debug "4"
-
-human-signals@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
- integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
-
-human-signals@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
- integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
-
-humanize-ms@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
- integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
- dependencies:
- ms "^2.0.0"
-
-iconv-lite@0.4.24:
- version "0.4.24"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
- integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
- dependencies:
- safer-buffer ">= 2.1.2 < 3"
-
-iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3:
- version "0.6.3"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
- integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
- dependencies:
- safer-buffer ">= 2.1.2 < 3.0.0"
-
-icss-utils@^5.0.0, icss-utils@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae"
- integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==
-
-ieee754@^1.1.13, ieee754@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
- integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
-
-ignore@^5.1.4, ignore@^5.1.9, ignore@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
- integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
-
-ignore@^5.3.1:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef"
- integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
-
-import-fresh@^3.2.1:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
- integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
- dependencies:
- parent-module "^1.0.0"
- resolve-from "^4.0.0"
-
-import-lazy@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153"
- integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==
-
-import-local@^3.0.2:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
- integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
- dependencies:
- pkg-dir "^4.2.0"
- resolve-cwd "^3.0.0"
-
-imurmurhash@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
- integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
-
-indent-string@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
- integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
-
-infer-owner@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
- integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
-
-inflight@^1.0.4:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
- dependencies:
- once "^1.3.0"
- wrappy "1"
-
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
- version "1.3.8"
- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
- integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-
-internal-slot@^1.0.3, internal-slot@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802"
- integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
- dependencies:
- es-errors "^1.3.0"
- hasown "^2.0.0"
- side-channel "^1.0.4"
-
-interpret@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
- integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
-
-ip-address@^9.0.5:
- version "9.0.5"
- resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a"
- integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==
- dependencies:
- jsbn "1.1.0"
- sprintf-js "^1.1.3"
-
-ip@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
- integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
-
-ipaddr.js@1.9.1:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
- integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
-
-irc-framework@4.14.0:
- version "4.14.0"
- resolved "https://registry.yarnpkg.com/irc-framework/-/irc-framework-4.14.0.tgz#1854229c61e71bc3ca44c504afa4f31ace2c10de"
- integrity sha512-lNujDAxy9kcu89WbU5H7IDWly64aD1B9nN9AV5M6btfx88qyQuyH16j1tjS40nmkQH6ld6vvaihKRn9cjk1JrA==
- dependencies:
- buffer "^6.0.3"
- core-js "^3.38.1"
- eventemitter3 "^5.0.1"
- grapheme-splitter "^1.0.4"
- iconv-lite "^0.6.3"
- isomorphic-textencoder "^1.0.1"
- lodash "^4.17.21"
- middleware-handler "^0.2.0"
- regenerator-runtime "^0.14.1"
- socks "^2.8.3"
- stream-browserify "^3.0.0"
- util "^0.12.5"
-
-is-arguments@^1.0.4:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
- integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
- dependencies:
- call-bind "^1.0.2"
- has-tostringtag "^1.0.0"
-
-is-array-buffer@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98"
- integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==
- dependencies:
- call-bind "^1.0.2"
- get-intrinsic "^1.2.1"
-
-is-arrayish@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
- integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
-
-is-bigint@^1.0.1:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
- integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
- dependencies:
- has-bigints "^1.0.1"
-
-is-binary-path@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
- integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
- dependencies:
- binary-extensions "^2.0.0"
-
-is-boolean-object@^1.1.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
- integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
- dependencies:
- call-bind "^1.0.2"
- has-tostringtag "^1.0.0"
-
-is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4, is-callable@^1.2.7:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
- integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
-
-is-core-module@^2.5.0, is-core-module@^2.9.0:
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
- integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
- dependencies:
- has "^1.0.3"
-
-is-data-view@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f"
- integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==
- dependencies:
- is-typed-array "^1.1.13"
-
-is-date-object@^1.0.1:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
- integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
- dependencies:
- has-tostringtag "^1.0.0"
-
-is-extglob@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
- integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
-
-is-fullwidth-code-point@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
- integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-
-is-generator-function@^1.0.7:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
- integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
- dependencies:
- has-tostringtag "^1.0.0"
-
-is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
- integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
- dependencies:
- is-extglob "^2.1.1"
-
-is-lambda@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5"
- integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==
-
-is-negative-zero@^2.0.2, is-negative-zero@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
- integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
-
-is-number-object@^1.0.4:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
- integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
- dependencies:
- has-tostringtag "^1.0.0"
-
-is-number@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
- integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-
-is-path-inside@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
- integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
-
-is-plain-obj@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
- integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==
-
-is-plain-obj@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
- integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
-
-is-plain-object@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
- integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
- dependencies:
- isobject "^3.0.1"
-
-is-plain-object@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
- integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
-
-is-regex@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
- integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
- dependencies:
- call-bind "^1.0.2"
- has-tostringtag "^1.0.0"
-
-is-regexp@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d"
- integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==
-
-is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688"
- integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==
- dependencies:
- call-bind "^1.0.7"
-
-is-stream@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
- integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
-
-is-string@^1.0.5, is-string@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
- integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
- dependencies:
- has-tostringtag "^1.0.0"
-
-is-symbol@^1.0.2, is-symbol@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
- integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
- dependencies:
- has-symbols "^1.0.2"
-
-is-typed-array@^1.1.13, is-typed-array@^1.1.3:
- version "1.1.13"
- resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229"
- integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
- dependencies:
- which-typed-array "^1.1.14"
-
-is-typedarray@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
- integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
-
-is-unicode-supported@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
- integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
-
-is-utf8@0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
- integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==
-
-is-weakref@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
- integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
- dependencies:
- call-bind "^1.0.2"
-
-is-windows@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
- integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
-
-isarray@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
- integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==
-
-isarray@^2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
- integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
-
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
-
-isobject@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
- integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
-
-isomorphic-textencoder@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/isomorphic-textencoder/-/isomorphic-textencoder-1.0.1.tgz#38dcd3b4416d29cd33e274f64b99ae567cd15e83"
- integrity sha512-676hESgHullDdHDsj469hr+7t3i/neBKU9J7q1T4RHaWwLAsaQnywC0D1dIUId0YZ+JtVrShzuBk1soo0+GVcQ==
- dependencies:
- fast-text-encoding "^1.0.0"
-
-istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3"
- integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==
-
-istanbul-lib-hook@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6"
- integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==
- dependencies:
- append-transform "^2.0.0"
-
-istanbul-lib-instrument@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d"
- integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==
- dependencies:
- "@babel/core" "^7.7.5"
- "@istanbuljs/schema" "^0.1.2"
- istanbul-lib-coverage "^3.0.0"
- semver "^6.3.0"
-
-istanbul-lib-instrument@^5.0.4:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f"
- integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==
- dependencies:
- "@babel/core" "^7.12.3"
- "@babel/parser" "^7.14.7"
- "@istanbuljs/schema" "^0.1.2"
- istanbul-lib-coverage "^3.2.0"
- semver "^6.3.0"
-
-istanbul-lib-processinfo@^2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169"
- integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==
- dependencies:
- archy "^1.0.0"
- cross-spawn "^7.0.3"
- istanbul-lib-coverage "^3.2.0"
- p-map "^3.0.0"
- rimraf "^3.0.0"
- uuid "^8.3.2"
-
-istanbul-lib-report@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
- integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==
- dependencies:
- istanbul-lib-coverage "^3.0.0"
- make-dir "^3.0.0"
- supports-color "^7.1.0"
-
-istanbul-lib-source-maps@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
- integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
- dependencies:
- debug "^4.1.1"
- istanbul-lib-coverage "^3.0.0"
- source-map "^0.6.1"
-
-istanbul-reports@^3.0.2:
- version "3.1.5"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae"
- integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==
- dependencies:
- html-escaper "^2.0.0"
- istanbul-lib-report "^3.0.0"
-
-jackspeak@^2.3.6:
- version "2.3.6"
- resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8"
- integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==
- dependencies:
- "@isaacs/cliui" "^8.0.2"
- optionalDependencies:
- "@pkgjs/parseargs" "^0.11.0"
-
-jest-worker@^27.4.5:
- version "27.5.1"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
- integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
- dependencies:
- "@types/node" "*"
- merge-stream "^2.0.0"
- supports-color "^8.0.0"
-
-js-beautify@^1.14.9:
- version "1.15.1"
- resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.15.1.tgz#4695afb508c324e1084ee0b952a102023fc65b64"
- integrity sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==
- dependencies:
- config-chain "^1.1.13"
- editorconfig "^1.0.4"
- glob "^10.3.3"
- js-cookie "^3.0.5"
- nopt "^7.2.0"
-
-js-cookie@^3.0.5:
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc"
- integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==
-
-js-tokens@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
- integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-
-js-yaml@4.1.0, js-yaml@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
- integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
- dependencies:
- argparse "^2.0.1"
-
-js-yaml@^3.13.1:
- version "3.14.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
- integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
- dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
-
-jsbn@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040"
- integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==
-
-jsesc@^2.5.1:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
- integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
-
-jsesc@~0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
- integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
-
-json-buffer@3.0.1, json-buffer@~3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
- integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
-
-json-parse-better-errors@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
- integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
-
-json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
- integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
-
-json-schema-traverse@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
- integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-
-json-schema-traverse@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
- integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
-
-json-stable-stringify-without-jsonify@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
- integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
-
-json5@^2.1.2, json5@^2.2.1:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
- integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
-
-jsonfile@^6.0.1:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
- integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
- dependencies:
- universalify "^2.0.0"
- optionalDependencies:
- graceful-fs "^4.1.6"
-
-just-extend@^4.0.2:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744"
- integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==
-
-jwa@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc"
- integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==
- dependencies:
- buffer-equal-constant-time "1.0.1"
- ecdsa-sig-formatter "1.0.11"
- safe-buffer "^5.0.1"
-
-jws@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4"
- integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==
- dependencies:
- jwa "^2.0.0"
- safe-buffer "^5.0.1"
-
-keyv@^4.0.0:
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.3.3.tgz#6c1bcda6353a9e96fc1b4e1aeb803a6e35090ba9"
- integrity sha512-AcysI17RvakTh8ir03+a3zJr5r0ovnAH/XTXei/4HIv3bL2K/jzvgivLK9UuI/JbU1aJjM3NSAnVvVVd3n+4DQ==
- dependencies:
- compress-brotli "^1.3.8"
- json-buffer "3.0.1"
-
-kind-of@^6.0.2, kind-of@^6.0.3:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
- integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
-
-klona@^2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc"
- integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==
-
-known-css-properties@^0.24.0:
- version "0.24.0"
- resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.24.0.tgz#19aefd85003ae5698a5560d2b55135bf5432155c"
- integrity sha512-RTSoaUAfLvpR357vWzAz/50Q/BmHfmE6ETSWfutT0AJiw10e6CmcdYRQJlLRd95B53D0Y2aD1jSxD3V3ySF+PA==
-
-ldap-filter@^0.3.3:
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/ldap-filter/-/ldap-filter-0.3.3.tgz#2b14c68a2a9d4104dbdbc910a1ca85fd189e9797"
- integrity sha512-/tFkx5WIn4HuO+6w9lsfxq4FN3O+fDZeO9Mek8dCD8rTUpqzRa766BOBO7BcGkn3X86m5+cBm1/2S/Shzz7gMg==
- dependencies:
- assert-plus "^1.0.0"
-
-ldapjs@2.3.3:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/ldapjs/-/ldapjs-2.3.3.tgz#06c317d3cbb5ac42fbba741e1a8b130ffcf997ab"
- integrity sha512-75QiiLJV/PQqtpH+HGls44dXweviFwQ6SiIK27EqzKQ5jU/7UFrl2E5nLdQ3IYRBzJ/AVFJI66u0MZ0uofKYwg==
- dependencies:
- abstract-logging "^2.0.0"
- asn1 "^0.2.4"
- assert-plus "^1.0.0"
- backoff "^2.5.0"
- ldap-filter "^0.3.3"
- once "^1.4.0"
- vasync "^2.2.0"
- verror "^1.8.1"
-
-levn@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
- integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
- dependencies:
- prelude-ls "^1.2.1"
- type-check "~0.4.0"
-
-lilconfig@^2.0.3:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4"
- integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==
-
-lines-and-columns@^1.1.6:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
- integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
-
-linkify-it@3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e"
- integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==
- dependencies:
- uc.micro "^1.0.1"
-
-load-json-file@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
- integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^4.0.0"
- pify "^3.0.0"
- strip-bom "^3.0.0"
-
-loader-runner@^4.2.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
- integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
-
-loader-utils@^2.0.0:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c"
- integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==
- dependencies:
- big.js "^5.2.2"
- emojis-list "^3.0.0"
- json5 "^2.1.2"
-
-locate-path@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
- integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
- dependencies:
- p-locate "^4.1.0"
-
-locate-path@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
- integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
- dependencies:
- p-locate "^5.0.0"
-
-lodash.debounce@^4.0.8:
- version "4.0.8"
- resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
- integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
-
-lodash.flattendeep@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2"
- integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==
-
-lodash.get@^4.4.2:
- version "4.4.2"
- resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
- integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==
-
-lodash.memoize@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
- integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
-
-lodash.merge@^4.6.2:
- version "4.6.2"
- resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
- integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-
-lodash.truncate@^4.4.2:
- version "4.4.2"
- resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
- integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
-
-lodash.uniq@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
- integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==
-
-lodash@4.17.21, lodash@^4.17.21:
- version "4.17.21"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
- integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-
-log-symbols@4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
- integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
- dependencies:
- chalk "^4.1.0"
- is-unicode-supported "^0.1.0"
-
-loupe@^2.3.1:
- version "2.3.4"
- resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3"
- integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==
- dependencies:
- get-func-name "^2.0.0"
-
-lowercase-keys@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
- integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
-
-lru-cache@^10.2.0:
- version "10.2.2"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878"
- integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==
-
-lru-cache@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
- integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
- dependencies:
- yallist "^4.0.0"
-
-magic-string@^0.25.7:
- version "0.25.9"
- resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c"
- integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==
- dependencies:
- sourcemap-codec "^1.4.8"
-
-make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
- integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
- dependencies:
- semver "^6.0.0"
-
-make-error@^1.1.1:
- version "1.3.6"
- resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
- integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
-
-make-fetch-happen@^9.1.0:
- version "9.1.0"
- resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968"
- integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==
- dependencies:
- agentkeepalive "^4.1.3"
- cacache "^15.2.0"
- http-cache-semantics "^4.1.0"
- http-proxy-agent "^4.0.1"
- https-proxy-agent "^5.0.0"
- is-lambda "^1.0.1"
- lru-cache "^6.0.0"
- minipass "^3.1.3"
- minipass-collect "^1.0.2"
- minipass-fetch "^1.3.2"
- minipass-flush "^1.0.5"
- minipass-pipeline "^1.2.4"
- negotiator "^0.6.2"
- promise-retry "^2.0.1"
- socks-proxy-agent "^6.0.0"
- ssri "^8.0.0"
-
-map-obj@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
- integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==
-
-map-obj@^4.0.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a"
- integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==
-
-mathml-tag-names@^2.1.3:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
- integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
-
-mdn-data@2.0.14:
- version "2.0.14"
- resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
- integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
-
-media-typer@0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
- integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
-
-memfs@^3.4.1:
- version "3.4.7"
- resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.7.tgz#e5252ad2242a724f938cb937e3c4f7ceb1f70e5a"
- integrity sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==
- dependencies:
- fs-monkey "^1.0.3"
-
-memfs@^3.4.3:
- version "3.4.13"
- resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.13.tgz#248a8bd239b3c240175cd5ec548de5227fc4f345"
- integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==
- dependencies:
- fs-monkey "^1.0.3"
-
-memorystream@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
- integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==
-
-meow@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364"
- integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==
- dependencies:
- "@types/minimist" "^1.2.0"
- camelcase-keys "^6.2.2"
- decamelize "^1.2.0"
- decamelize-keys "^1.1.0"
- hard-rejection "^2.1.0"
- minimist-options "4.1.0"
- normalize-package-data "^3.0.0"
- read-pkg-up "^7.0.1"
- redent "^3.0.0"
- trim-newlines "^3.0.0"
- type-fest "^0.18.0"
- yargs-parser "^20.2.3"
-
-merge-descriptors@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5"
- integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==
-
-merge-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
- integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-
-merge2@^1.3.0, merge2@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
- integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-
-methods@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
- integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
-
-micromatch@^4.0.0, micromatch@^4.0.4:
- version "4.0.5"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
- integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
- dependencies:
- braces "^3.0.2"
- picomatch "^2.3.1"
-
-middleware-handler@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/middleware-handler/-/middleware-handler-0.2.0.tgz#bf02af7e6b577c0230609b2ae58df0e446f3fd02"
- integrity sha512-Qz4B0yWndSokapr3Kl7fpMRysS0DaBlOuATrExFuZbr+oXZ3rsAPufdLe8mUJXiG5A4aJGW6GfKS4PDfQwu7Mg==
-
-mime-db@1.52.0:
- version "1.52.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
- integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
-
-mime-types@2.1.35, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34:
- version "2.1.35"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
- integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
- dependencies:
- mime-db "1.52.0"
-
-mime@1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
- integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-
-mimic-fn@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
- integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-
-mimic-response@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
- integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
-
-mimic-response@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
- integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
-
-min-indent@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
- integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
-
-mini-css-extract-plugin@2.5.3:
- version "2.5.3"
- resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz#c5c79f9b22ce9b4f164e9492267358dbe35376d9"
- integrity sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw==
- dependencies:
- schema-utils "^4.0.0"
-
-minimalistic-assert@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
- integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
-
-minimatch@4.2.1:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4"
- integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==
- dependencies:
- brace-expansion "^1.1.7"
-
-minimatch@9.0.1:
- version "9.0.1"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253"
- integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==
- dependencies:
- brace-expansion "^2.0.1"
-
-minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
- integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
- dependencies:
- brace-expansion "^1.1.7"
-
-minimatch@^9.0.1, minimatch@^9.0.4:
- version "9.0.4"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51"
- integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==
- dependencies:
- brace-expansion "^2.0.1"
-
-minimist-options@4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
- integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
- dependencies:
- arrify "^1.0.1"
- is-plain-obj "^1.1.0"
- kind-of "^6.0.3"
-
-minimist@^1.2.0, minimist@^1.2.5:
- version "1.2.6"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
- integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
-
-minimist@^1.2.3:
- version "1.2.8"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
- integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
-
-minipass-collect@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
- integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
- dependencies:
- minipass "^3.0.0"
-
-minipass-fetch@^1.3.2:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6"
- integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==
- dependencies:
- minipass "^3.1.0"
- minipass-sized "^1.0.3"
- minizlib "^2.0.0"
- optionalDependencies:
- encoding "^0.1.12"
-
-minipass-flush@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
- integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
- dependencies:
- minipass "^3.0.0"
-
-minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
- integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
- dependencies:
- minipass "^3.0.0"
-
-minipass-sized@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70"
- integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==
- dependencies:
- minipass "^3.0.0"
-
-minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3:
- version "3.3.4"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae"
- integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==
- dependencies:
- yallist "^4.0.0"
-
-"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.0.tgz#b545f84af94e567386770159302ca113469c80b8"
- integrity sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==
-
-minizlib@^2.0.0, minizlib@^2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
- integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
- dependencies:
- minipass "^3.0.0"
- yallist "^4.0.0"
-
-mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
- integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
-
-mkdirp@^1.0.3, mkdirp@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
- integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-
-mocha@9.2.2:
- version "9.2.2"
- resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9"
- integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==
- dependencies:
- "@ungap/promise-all-settled" "1.1.2"
- ansi-colors "4.1.1"
- browser-stdout "1.3.1"
- chokidar "3.5.3"
- debug "4.3.3"
- diff "5.0.0"
- escape-string-regexp "4.0.0"
- find-up "5.0.0"
- glob "7.2.0"
- growl "1.10.5"
- he "1.2.0"
- js-yaml "4.1.0"
- log-symbols "4.1.0"
- minimatch "4.2.1"
- ms "2.1.3"
- nanoid "3.3.1"
- serialize-javascript "6.0.0"
- strip-json-comments "3.1.1"
- supports-color "8.1.1"
- which "2.0.2"
- workerpool "6.2.0"
- yargs "16.2.0"
- yargs-parser "20.2.4"
- yargs-unparser "2.0.0"
-
-mousetrap@1.6.5:
- version "1.6.5"
- resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.6.5.tgz#8a766d8c272b08393d5f56074e0b5ec183485bf9"
- integrity sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==
-
-mri@^1.1.5:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b"
- integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==
-
-ms@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
- integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
-
-ms@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-ms@2.1.3, ms@^2.0.0:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
- integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-
-multimatch@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3"
- integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==
- dependencies:
- "@types/minimatch" "^3.0.3"
- array-differ "^3.0.0"
- array-union "^2.1.0"
- arrify "^2.0.1"
- minimatch "^3.0.4"
-
-mute-stream@~0.0.4:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
- integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
-
-nanoid@3.3.1:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35"
- integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==
-
-nanoid@^3.3.4:
- version "3.3.4"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
- integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
-
-nanoid@^3.3.7:
- version "3.3.7"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
- integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
-
-napi-build-utils@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
- integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
-
-natural-compare@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
- integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
-
-negotiator@0.6.3, negotiator@^0.6.2:
- version "0.6.3"
- resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
- integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
-
-neo-async@^2.6.2:
- version "2.6.2"
- resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
- integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
-
-nice-try@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
- integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
-
-nise@^4.0.4:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/nise/-/nise-4.1.0.tgz#8fb75a26e90b99202fa1e63f448f58efbcdedaf6"
- integrity sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==
- dependencies:
- "@sinonjs/commons" "^1.7.0"
- "@sinonjs/fake-timers" "^6.0.0"
- "@sinonjs/text-encoding" "^0.7.1"
- just-extend "^4.0.2"
- path-to-regexp "^1.7.0"
-
-nise@^5.1.1:
- version "5.1.4"
- resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.4.tgz#491ce7e7307d4ec546f5a659b2efe94a18b4bbc0"
- integrity sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==
- dependencies:
- "@sinonjs/commons" "^2.0.0"
- "@sinonjs/fake-timers" "^10.0.2"
- "@sinonjs/text-encoding" "^0.7.1"
- just-extend "^4.0.2"
- path-to-regexp "^1.7.0"
-
-node-abi@^3.3.0:
- version "3.54.0"
- resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.54.0.tgz#f6386f7548817acac6434c6cba02999c9aebcc69"
- integrity sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==
- dependencies:
- semver "^7.3.5"
-
-node-abort-controller@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.0.1.tgz#f91fa50b1dee3f909afabb7e261b1e1d6b0cb74e"
- integrity sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==
-
-node-addon-api@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.0.0.tgz#8136add2f510997b3b94814f4af1cce0b0e3962e"
- integrity sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==
-
-node-forge@1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3"
- integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
-
-node-gyp@8.x:
- version "8.4.1"
- resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937"
- integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==
- dependencies:
- env-paths "^2.2.0"
- glob "^7.1.4"
- graceful-fs "^4.2.6"
- make-fetch-happen "^9.1.0"
- nopt "^5.0.0"
- npmlog "^6.0.0"
- rimraf "^3.0.2"
- semver "^7.3.5"
- tar "^6.1.2"
- which "^2.0.2"
-
-node-preload@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301"
- integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==
- dependencies:
- process-on-spawn "^1.0.0"
-
-node-releases@^2.0.18:
- version "2.0.18"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
- integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
-
-node-releases@^2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503"
- integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
-
-nopt@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
- integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==
- dependencies:
- abbrev "1"
-
-nopt@^7.2.0:
- version "7.2.1"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7"
- integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==
- dependencies:
- abbrev "^2.0.0"
-
-normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
- integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
- dependencies:
- hosted-git-info "^2.1.4"
- resolve "^1.10.0"
- semver "2 || 3 || 4 || 5"
- validate-npm-package-license "^3.0.1"
-
-normalize-package-data@^3.0.0:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e"
- integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==
- dependencies:
- hosted-git-info "^4.0.1"
- is-core-module "^2.5.0"
- semver "^7.3.4"
- validate-npm-package-license "^3.0.1"
-
-normalize-path@^3.0.0, normalize-path@~3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
- integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-
-normalize-range@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
- integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==
-
-normalize-selector@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03"
- integrity sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==
-
-normalize-url@^6.0.1:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
- integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
-
-normalize.css@8.0.1:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3"
- integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==
-
-npm-run-all@4.1.5:
- version "4.1.5"
- resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba"
- integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==
- dependencies:
- ansi-styles "^3.2.1"
- chalk "^2.4.1"
- cross-spawn "^6.0.5"
- memorystream "^0.3.1"
- minimatch "^3.0.4"
- pidtree "^0.3.0"
- read-pkg "^3.0.0"
- shell-quote "^1.6.1"
- string.prototype.padend "^3.0.0"
-
-npm-run-path@^4.0.0, npm-run-path@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
- integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
- dependencies:
- path-key "^3.0.0"
-
-npmlog@^6.0.0:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830"
- integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==
- dependencies:
- are-we-there-yet "^3.0.0"
- console-control-strings "^1.1.0"
- gauge "^4.0.3"
- set-blocking "^2.0.0"
-
-nth-check@^2.0.1, nth-check@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
- integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
- dependencies:
- boolbase "^1.0.0"
-
-nyc@15.1.0:
- version "15.1.0"
- resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02"
- integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==
- dependencies:
- "@istanbuljs/load-nyc-config" "^1.0.0"
- "@istanbuljs/schema" "^0.1.2"
- caching-transform "^4.0.0"
- convert-source-map "^1.7.0"
- decamelize "^1.2.0"
- find-cache-dir "^3.2.0"
- find-up "^4.1.0"
- foreground-child "^2.0.0"
- get-package-type "^0.1.0"
- glob "^7.1.6"
- istanbul-lib-coverage "^3.0.0"
- istanbul-lib-hook "^3.0.0"
- istanbul-lib-instrument "^4.0.0"
- istanbul-lib-processinfo "^2.0.2"
- istanbul-lib-report "^3.0.0"
- istanbul-lib-source-maps "^4.0.0"
- istanbul-reports "^3.0.2"
- make-dir "^3.0.0"
- node-preload "^0.2.1"
- p-map "^3.0.0"
- process-on-spawn "^1.0.0"
- resolve-from "^5.0.0"
- rimraf "^3.0.0"
- signal-exit "^3.0.2"
- spawn-wrap "^2.0.0"
- test-exclude "^6.0.0"
- yargs "^15.0.2"
-
-object-assign@^4:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
- integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
-
-object-inspect@^1.12.0, object-inspect@^1.13.1:
- version "1.13.2"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
- integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
-
-object-keys@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
- integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
-
-object.assign@^4.1.0:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
- integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
- dependencies:
- call-bind "^1.0.0"
- define-properties "^1.1.3"
- has-symbols "^1.0.1"
- object-keys "^1.1.1"
-
-object.assign@^4.1.2, object.assign@^4.1.5:
- version "4.1.5"
- resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0"
- integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
- dependencies:
- call-bind "^1.0.5"
- define-properties "^1.2.1"
- has-symbols "^1.0.3"
- object-keys "^1.1.1"
-
-on-finished@2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
- integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
- dependencies:
- ee-first "1.1.1"
-
-once@^1.3.0, once@^1.3.1, once@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
- dependencies:
- wrappy "1"
-
-onetime@^5.1.0, onetime@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
- integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
- dependencies:
- mimic-fn "^2.1.0"
-
-optionator@^0.9.3:
- version "0.9.4"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
- integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
- dependencies:
- deep-is "^0.1.3"
- fast-levenshtein "^2.0.6"
- levn "^0.4.1"
- prelude-ls "^1.2.1"
- type-check "^0.4.0"
- word-wrap "^1.2.5"
-
-p-cancelable@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
- integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
-
-p-finally@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
- integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==
-
-p-limit@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
- integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
- dependencies:
- p-try "^2.0.0"
-
-p-limit@^3.0.2:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
- integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
- dependencies:
- yocto-queue "^0.1.0"
-
-p-locate@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
- integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
- dependencies:
- p-limit "^2.2.0"
-
-p-locate@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
- integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
- dependencies:
- p-limit "^3.0.2"
-
-p-map@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
- integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
- dependencies:
- aggregate-error "^3.0.0"
-
-p-map@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
- integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
- dependencies:
- aggregate-error "^3.0.0"
-
-p-try@^2.0.0, p-try@^2.1.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
- integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
-
-package-hash@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506"
- integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==
- dependencies:
- graceful-fs "^4.1.15"
- hasha "^5.0.0"
- lodash.flattendeep "^4.4.0"
- release-zalgo "^1.0.0"
-
-package-json@7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/package-json/-/package-json-7.0.0.tgz#1355416e50a5c1b8f1a6f471197a3650d21186bf"
- integrity sha512-CHJqc94AA8YfSLHGQT3DbvSIuE12NLFekpM4n7LRrAd3dOJtA911+4xe9q6nC3/jcKraq7nNS9VxgtT0KC+diA==
- dependencies:
- got "^11.8.2"
- registry-auth-token "^4.0.0"
- registry-url "^5.0.0"
- semver "^7.3.5"
-
-parent-module@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
- integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
- dependencies:
- callsites "^3.0.0"
-
-parse-json@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
- integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==
- dependencies:
- error-ex "^1.3.1"
- json-parse-better-errors "^1.0.1"
-
-parse-json@^5.0.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
- integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
- 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"
-
-parse5-htmlparser2-tree-adapter@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1"
- integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==
- dependencies:
- domhandler "^5.0.2"
- parse5 "^7.0.0"
-
-parse5-parser-stream@^7.1.2:
- version "7.1.2"
- resolved "https://registry.yarnpkg.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz#d7c20eadc37968d272e2c02660fff92dd27e60e1"
- integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==
- dependencies:
- parse5 "^7.0.0"
-
-parse5@^7.0.0, parse5@^7.1.2:
- version "7.1.2"
- resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32"
- integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
- dependencies:
- entities "^4.4.0"
-
-parseurl@~1.3.3:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
- integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
-
-path-exists@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
- integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
-
-path-is-absolute@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
- integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
-
-path-key@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
- integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
-
-path-key@^3.0.0, path-key@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
- integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-
-path-parse@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
- integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
-
-path-scurry@^1.10.2:
- version "1.10.2"
- resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7"
- integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==
- dependencies:
- lru-cache "^10.2.0"
- minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
-
-path-to-regexp@0.1.10:
- version "0.1.10"
- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b"
- integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==
-
-path-to-regexp@^1.7.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a"
- integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==
- dependencies:
- isarray "0.0.1"
-
-path-type@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
- integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
- dependencies:
- pify "^3.0.0"
-
-path-type@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
- integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
-
-pathval@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
- integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
-
-peek-readable@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.1.0.tgz#4ece1111bf5c2ad8867c314c81356847e8a62e72"
- integrity sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==
-
-picocolors@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
- integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
-
-picocolors@^1.0.1, picocolors@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59"
- integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==
-
-picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
- integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-
-pidtree@^0.3.0:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a"
- integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==
-
-pify@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
- integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
-
-pify@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
- integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==
-
-pify@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
- integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
-
-pkg-dir@^4.1.0, pkg-dir@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
- integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
- dependencies:
- find-up "^4.0.0"
-
-possible-typed-array-names@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
- integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
-
-postcss-attribute-case-insensitive@^5.0.0:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741"
- integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==
- dependencies:
- postcss-selector-parser "^6.0.10"
-
-postcss-calc@^8.2.3:
- version "8.2.4"
- resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5"
- integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==
- dependencies:
- postcss-selector-parser "^6.0.9"
- postcss-value-parser "^4.2.0"
-
-postcss-clamp@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-3.0.0.tgz#09cb1ad64243b46c9159ded5e8d3e8349150a09e"
- integrity sha512-QENQMIF/Grw0qX0RzSPJjw+mAiGPIwG2AnsQDIoR/WJ5Q19zLB0NrZX8cH7CzzdDWEerTPGCdep7ItFaAdtItg==
- dependencies:
- postcss-value-parser "^4.1.0"
-
-postcss-color-functional-notation@^4.2.1:
- version "4.2.4"
- resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec"
- integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-color-hex-alpha@^8.0.2:
- version "8.0.4"
- resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5"
- integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-color-rebeccapurple@^7.0.2:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0"
- integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-colormin@^5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a"
- integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==
- dependencies:
- browserslist "^4.16.6"
- caniuse-api "^3.0.0"
- colord "^2.9.1"
- postcss-value-parser "^4.2.0"
-
-postcss-convert-values@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz#31586df4e184c2e8890e8b34a0b9355313f503ab"
- integrity sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==
- dependencies:
- browserslist "^4.20.3"
- postcss-value-parser "^4.2.0"
-
-postcss-custom-media@^8.0.0:
- version "8.0.2"
- resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea"
- integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-custom-properties@^12.1.4:
- version "12.1.8"
- resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.8.tgz#aa003e1885c5bd28e2e32496cd597e389ca889e4"
- integrity sha512-8rbj8kVu00RQh2fQF81oBqtduiANu4MIxhyf0HbbStgPtnFlWn0yiaYTpLHrPnJbffVY1s9apWsIoVZcc68FxA==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-custom-selectors@^6.0.0:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9"
- integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==
- dependencies:
- postcss-selector-parser "^6.0.4"
-
-postcss-dir-pseudo-class@^6.0.3:
- version "6.0.5"
- resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c"
- integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==
- dependencies:
- postcss-selector-parser "^6.0.10"
-
-postcss-discard-comments@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696"
- integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==
-
-postcss-discard-duplicates@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848"
- integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==
-
-postcss-discard-empty@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c"
- integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==
-
-postcss-discard-overridden@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e"
- integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==
-
-postcss-double-position-gradients@^3.0.4:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91"
- integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==
- dependencies:
- "@csstools/postcss-progressive-custom-properties" "^1.1.0"
- postcss-value-parser "^4.2.0"
-
-postcss-env-function@^4.0.4:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a"
- integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-focus-visible@^6.0.3:
- version "6.0.4"
- resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e"
- integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==
- dependencies:
- postcss-selector-parser "^6.0.9"
-
-postcss-focus-within@^5.0.3:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20"
- integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==
- dependencies:
- postcss-selector-parser "^6.0.9"
-
-postcss-font-variant@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66"
- integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==
-
-postcss-gap-properties@^3.0.2:
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff"
- integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==
-
-postcss-image-set-function@^4.0.5:
- version "4.0.7"
- resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f"
- integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-import@14.0.2:
- version "14.0.2"
- resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.2.tgz#60eff77e6be92e7b67fe469ec797d9424cae1aa1"
- integrity sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==
- dependencies:
- postcss-value-parser "^4.0.0"
- read-cache "^1.0.0"
- resolve "^1.1.7"
-
-postcss-initial@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42"
- integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==
-
-postcss-lab-function@^4.0.3:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98"
- integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==
- dependencies:
- "@csstools/postcss-progressive-custom-properties" "^1.1.0"
- postcss-value-parser "^4.2.0"
-
-postcss-loader@6.2.1:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef"
- integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==
- dependencies:
- cosmiconfig "^7.0.0"
- klona "^2.0.5"
- semver "^7.3.5"
-
-postcss-logical@^5.0.3:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73"
- integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==
-
-postcss-media-minmax@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5"
- integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==
-
-postcss-media-query-parser@^0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
- integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==
-
-postcss-merge-longhand@^5.1.6:
- version "5.1.6"
- resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz#f378a8a7e55766b7b644f48e5d8c789ed7ed51ce"
- integrity sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==
- dependencies:
- postcss-value-parser "^4.2.0"
- stylehacks "^5.1.0"
-
-postcss-merge-rules@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz#7049a14d4211045412116d79b751def4484473a5"
- integrity sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==
- dependencies:
- browserslist "^4.16.6"
- caniuse-api "^3.0.0"
- cssnano-utils "^3.1.0"
- postcss-selector-parser "^6.0.5"
-
-postcss-minify-font-values@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b"
- integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-minify-gradients@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c"
- integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==
- dependencies:
- colord "^2.9.1"
- cssnano-utils "^3.1.0"
- postcss-value-parser "^4.2.0"
-
-postcss-minify-params@^5.1.3:
- version "5.1.3"
- resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz#ac41a6465be2db735099bbd1798d85079a6dc1f9"
- integrity sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==
- dependencies:
- browserslist "^4.16.6"
- cssnano-utils "^3.1.0"
- postcss-value-parser "^4.2.0"
-
-postcss-minify-selectors@^5.2.1:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6"
- integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==
- dependencies:
- postcss-selector-parser "^6.0.5"
-
-postcss-modules-extract-imports@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d"
- integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==
-
-postcss-modules-local-by-default@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c"
- integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==
- dependencies:
- icss-utils "^5.0.0"
- postcss-selector-parser "^6.0.2"
- postcss-value-parser "^4.1.0"
-
-postcss-modules-scope@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06"
- integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==
- dependencies:
- postcss-selector-parser "^6.0.4"
-
-postcss-modules-values@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c"
- integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==
- dependencies:
- icss-utils "^5.0.0"
-
-postcss-nesting@^10.1.2:
- version "10.1.10"
- resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.1.10.tgz#9c396df3d8232cbedfa95baaac6b765b8fd2a817"
- integrity sha512-lqd7LXCq0gWc0wKXtoKDru5wEUNjm3OryLVNRZ8OnW8km6fSNUuFrjEhU3nklxXE2jvd4qrox566acgh+xQt8w==
- dependencies:
- "@csstools/selector-specificity" "^2.0.0"
- postcss-selector-parser "^6.0.10"
-
-postcss-normalize-charset@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed"
- integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==
-
-postcss-normalize-display-values@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8"
- integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-positions@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92"
- integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-repeat-style@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2"
- integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-string@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228"
- integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-timing-functions@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb"
- integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-unicode@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75"
- integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==
- dependencies:
- browserslist "^4.16.6"
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-url@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc"
- integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==
- dependencies:
- normalize-url "^6.0.1"
- postcss-value-parser "^4.2.0"
-
-postcss-normalize-whitespace@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa"
- integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-opacity-percentage@^1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz#bd698bb3670a0a27f6d657cc16744b3ebf3b1145"
- integrity sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==
-
-postcss-ordered-values@^5.1.3:
- version "5.1.3"
- resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38"
- integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==
- dependencies:
- cssnano-utils "^3.1.0"
- postcss-value-parser "^4.2.0"
-
-postcss-overflow-shorthand@^3.0.2:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e"
- integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-page-break@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f"
- integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==
-
-postcss-place@^7.0.3:
- version "7.0.5"
- resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4"
- integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-preset-env@7.3.0:
- version "7.3.0"
- resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.3.0.tgz#c745dcfea659fa5a8424bb740fde4ad28e38518e"
- integrity sha512-mEK7vqBL/BvynALHNc9pC7T7jolNm3ouornf9p4WpXW+sGooV3kCLvS4kKXE+rL6i12LKUgleJOZRPaoOuNLEg==
- dependencies:
- "@csstools/postcss-font-format-keywords" "^1.0.0"
- "@csstools/postcss-hwb-function" "^1.0.0"
- "@csstools/postcss-is-pseudo-class" "^2.0.0"
- "@csstools/postcss-normalize-display-values" "^1.0.0"
- autoprefixer "^10.4.2"
- browserslist "^4.19.1"
- css-blank-pseudo "^3.0.2"
- css-has-pseudo "^3.0.3"
- css-prefers-color-scheme "^6.0.3"
- cssdb "^6.1.0"
- postcss-attribute-case-insensitive "^5.0.0"
- postcss-clamp "^3.0.0"
- postcss-color-functional-notation "^4.2.1"
- postcss-color-hex-alpha "^8.0.2"
- postcss-color-rebeccapurple "^7.0.2"
- postcss-custom-media "^8.0.0"
- postcss-custom-properties "^12.1.4"
- postcss-custom-selectors "^6.0.0"
- postcss-dir-pseudo-class "^6.0.3"
- postcss-double-position-gradients "^3.0.4"
- postcss-env-function "^4.0.4"
- postcss-focus-visible "^6.0.3"
- postcss-focus-within "^5.0.3"
- postcss-font-variant "^5.0.0"
- postcss-gap-properties "^3.0.2"
- postcss-image-set-function "^4.0.5"
- postcss-initial "^4.0.1"
- postcss-lab-function "^4.0.3"
- postcss-logical "^5.0.3"
- postcss-media-minmax "^5.0.0"
- postcss-nesting "^10.1.2"
- postcss-opacity-percentage "^1.1.1"
- postcss-overflow-shorthand "^3.0.2"
- postcss-page-break "^3.0.4"
- postcss-place "^7.0.3"
- postcss-pseudo-class-any-link "^7.1.0"
- postcss-replace-overflow-wrap "^4.0.0"
- postcss-selector-not "^5.0.0"
-
-postcss-pseudo-class-any-link@^7.1.0:
- version "7.1.6"
- resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab"
- integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==
- dependencies:
- postcss-selector-parser "^6.0.10"
-
-postcss-reduce-initial@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6"
- integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==
- dependencies:
- browserslist "^4.16.6"
- caniuse-api "^3.0.0"
-
-postcss-reduce-transforms@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9"
- integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==
- dependencies:
- postcss-value-parser "^4.2.0"
-
-postcss-replace-overflow-wrap@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319"
- integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==
-
-postcss-resolve-nested-selector@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e"
- integrity sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==
-
-postcss-safe-parser@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1"
- integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==
-
-postcss-selector-not@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz#ac5fc506f7565dd872f82f5314c0f81a05630dc7"
- integrity sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==
- dependencies:
- balanced-match "^1.0.0"
-
-postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9:
- version "6.0.10"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d"
- integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
- dependencies:
- cssesc "^3.0.0"
- util-deprecate "^1.0.2"
-
-postcss-selector-parser@^6.0.15:
- version "6.0.16"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04"
- integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==
- dependencies:
- cssesc "^3.0.0"
- util-deprecate "^1.0.2"
-
-postcss-svgo@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d"
- integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==
- dependencies:
- postcss-value-parser "^4.2.0"
- svgo "^2.7.0"
-
-postcss-unique-selectors@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6"
- integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==
- dependencies:
- postcss-selector-parser "^6.0.5"
-
-postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
- integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
-
-postcss@8.4.47:
- version "8.4.47"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365"
- integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==
- dependencies:
- nanoid "^3.3.7"
- picocolors "^1.1.0"
- source-map-js "^1.2.1"
-
-postcss@^8.1.10, postcss@^8.2.15, postcss@^8.4.5:
- version "8.4.14"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf"
- integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
- dependencies:
- nanoid "^3.3.4"
- picocolors "^1.0.0"
- source-map-js "^1.0.2"
-
-prebuild-install@^7.1.1:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45"
- integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==
- dependencies:
- detect-libc "^2.0.0"
- expand-template "^2.0.3"
- github-from-package "0.0.0"
- minimist "^1.2.3"
- mkdirp-classic "^0.5.3"
- napi-build-utils "^1.0.1"
- node-abi "^3.3.0"
- pump "^3.0.0"
- rc "^1.2.7"
- simple-get "^4.0.0"
- tar-fs "^2.0.0"
- tunnel-agent "^0.6.0"
-
-precond@0.2:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
- integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==
-
-prelude-ls@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
- integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
-
-prettier@2.5.1:
- version "2.5.1"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a"
- integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==
-
-pretty-quick@3.1.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.3.tgz#15281108c0ddf446675157ca40240099157b638e"
- integrity sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==
- dependencies:
- chalk "^3.0.0"
- execa "^4.0.0"
- find-up "^4.1.0"
- ignore "^5.1.4"
- mri "^1.1.5"
- multimatch "^4.0.0"
-
-primer-support@5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/primer-support/-/primer-support-5.0.0.tgz#d19c7cea59e8783400b9391943c8a2bb2ebddc5e"
- integrity sha512-inUxVSsGirn5IkPxBhFsMBgm8ZHyfOUmOWyDCN8cBXtbaLiCIAjHsPI46yS1zrWxnn0J2kvq8haomkrlHGF08g==
-
-primer-tooltips@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/primer-tooltips/-/primer-tooltips-2.0.0.tgz#953f271f411db2e7665282500bb75650ac82e9d8"
- integrity sha512-cNF3r3hG6sXLr71GbYyJw3BXCBhspW4FjzJ0Hx/BO+lP3XCrNAX/wqd57+vvnWSuaLif2O8s3/Prs3VBF50hVQ==
- dependencies:
- primer-support "5.0.0"
-
-process-on-spawn@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93"
- integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==
- dependencies:
- fromentries "^1.2.0"
-
-promise-inflight@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
- integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==
-
-promise-retry@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22"
- integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==
- dependencies:
- err-code "^2.0.2"
- retry "^0.12.0"
-
-proto-list@~1.2.1:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
- integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==
-
-proxy-addr@~2.0.7:
- version "2.0.7"
- resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
- integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
- dependencies:
- forwarded "0.2.0"
- ipaddr.js "1.9.1"
-
-pump@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.1"
-
-punycode@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
- integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-
-qs@6.11.0:
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
- integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
- dependencies:
- side-channel "^1.0.4"
-
-qs@6.13.0:
- version "6.13.0"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906"
- integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==
- dependencies:
- side-channel "^1.0.6"
-
-queue-microtask@^1.2.2:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
- integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
-
-quick-lru@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
- integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
-
-quick-lru@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
- integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
-
-randombytes@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
- integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
- dependencies:
- safe-buffer "^5.1.0"
-
-range-parser@^1.2.1, range-parser@~1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
- integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
-
-raw-body@2.5.2:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
- integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
- dependencies:
- bytes "3.1.2"
- http-errors "2.0.0"
- iconv-lite "0.4.24"
- unpipe "1.0.0"
-
-rc@1.2.8, rc@^1.2.7, rc@^1.2.8:
- version "1.2.8"
- resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
- integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
- dependencies:
- deep-extend "^0.6.0"
- ini "~1.3.0"
- minimist "^1.2.0"
- strip-json-comments "~2.0.1"
-
-read-cache@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
- integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==
- dependencies:
- pify "^2.3.0"
-
-read-chunk@3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-3.2.0.tgz#2984afe78ca9bfbbdb74b19387bf9e86289c16ca"
- integrity sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==
- dependencies:
- pify "^4.0.1"
- with-open-file "^0.1.6"
-
-read-pkg-up@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
- integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
- dependencies:
- find-up "^4.1.0"
- read-pkg "^5.2.0"
- type-fest "^0.8.1"
-
-read-pkg@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
- integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==
- dependencies:
- load-json-file "^4.0.0"
- normalize-package-data "^2.3.2"
- path-type "^3.0.0"
-
-read-pkg@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
- integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
- dependencies:
- "@types/normalize-package-data" "^2.4.0"
- normalize-package-data "^2.5.0"
- parse-json "^5.0.0"
- type-fest "^0.6.0"
-
-read@1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
- integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==
- dependencies:
- mute-stream "~0.0.4"
-
-readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0:
- version "3.6.2"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
- integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
- dependencies:
- inherits "^2.0.3"
- string_decoder "^1.1.1"
- util-deprecate "^1.0.1"
-
-readable-stream@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
- integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
- dependencies:
- inherits "^2.0.3"
- string_decoder "^1.1.1"
- util-deprecate "^1.0.1"
-
-readable-web-to-node-stream@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb"
- integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==
- dependencies:
- readable-stream "^3.6.0"
-
-readdirp@~3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
- integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
- dependencies:
- picomatch "^2.2.1"
-
-rechoir@^0.7.0:
- version "0.7.1"
- resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686"
- integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==
- dependencies:
- resolve "^1.9.0"
-
-redent@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
- integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
- dependencies:
- indent-string "^4.0.0"
- strip-indent "^3.0.0"
-
-regenerate-unicode-properties@^10.0.1:
- version "10.0.1"
- resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56"
- integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==
- dependencies:
- regenerate "^1.4.2"
-
-regenerate@^1.4.2:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
- integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
-
-regenerator-runtime@^0.13.4:
- version "0.13.9"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
- integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
-
-regenerator-runtime@^0.14.1:
- version "0.14.1"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
- integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
-
-regenerator-transform@^0.15.0:
- version "0.15.0"
- resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537"
- integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==
- dependencies:
- "@babel/runtime" "^7.8.4"
-
-regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.2:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334"
- integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==
- dependencies:
- call-bind "^1.0.6"
- define-properties "^1.2.1"
- es-errors "^1.3.0"
- set-function-name "^2.0.1"
-
-regexpu-core@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d"
- integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==
- dependencies:
- regenerate "^1.4.2"
- regenerate-unicode-properties "^10.0.1"
- regjsgen "^0.6.0"
- regjsparser "^0.8.2"
- unicode-match-property-ecmascript "^2.0.0"
- unicode-match-property-value-ecmascript "^2.0.0"
-
-registry-auth-token@^4.0.0:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac"
- integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==
- dependencies:
- rc "1.2.8"
-
-registry-url@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
- integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==
- dependencies:
- rc "^1.2.8"
-
-regjsgen@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d"
- integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==
-
-regjsparser@^0.8.2:
- version "0.8.4"
- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f"
- integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==
- dependencies:
- jsesc "~0.5.0"
-
-release-zalgo@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730"
- integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==
- dependencies:
- es6-error "^4.0.1"
-
-require-directory@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
- integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
-
-require-from-string@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
- integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
-
-require-main-filename@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
- integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
-
-resolve-alpn@^1.0.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9"
- integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==
-
-resolve-cwd@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
- integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
- dependencies:
- resolve-from "^5.0.0"
-
-resolve-from@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
- integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
-
-resolve-from@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
- integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-
-resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.9.0:
- version "1.22.1"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
- integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
- dependencies:
- is-core-module "^2.9.0"
- path-parse "^1.0.7"
- supports-preserve-symlinks-flag "^1.0.0"
-
-responselike@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc"
- integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==
- dependencies:
- lowercase-keys "^2.0.0"
-
-retry@^0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
- integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==
-
-reusify@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
- integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
-
-rimraf@^3.0.0, rimraf@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
- integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
- dependencies:
- glob "^7.1.3"
-
-run-parallel@^1.1.9:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
- integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
- dependencies:
- queue-microtask "^1.2.2"
-
-safe-array-concat@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb"
- integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==
- dependencies:
- call-bind "^1.0.7"
- get-intrinsic "^1.2.4"
- has-symbols "^1.0.3"
- isarray "^2.0.5"
-
-safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
- integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
-safe-buffer@~5.1.1:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
- integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-
-safe-regex-test@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
- integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==
- dependencies:
- call-bind "^1.0.6"
- es-errors "^1.3.0"
- is-regex "^1.1.4"
-
-"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0, safer-buffer@~2.1.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
- integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-
-schema-utils@^2.6.5:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
- integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
- dependencies:
- "@types/json-schema" "^7.0.5"
- ajv "^6.12.4"
- ajv-keywords "^3.5.2"
-
-schema-utils@^3.1.0, schema-utils@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
- integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
- dependencies:
- "@types/json-schema" "^7.0.8"
- ajv "^6.12.5"
- ajv-keywords "^3.5.2"
-
-schema-utils@^3.2.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe"
- integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==
- dependencies:
- "@types/json-schema" "^7.0.8"
- ajv "^6.12.5"
- ajv-keywords "^3.5.2"
-
-schema-utils@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7"
- integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==
- dependencies:
- "@types/json-schema" "^7.0.9"
- ajv "^8.8.0"
- ajv-formats "^2.1.1"
- ajv-keywords "^5.0.0"
-
-"semver@2 || 3 || 4 || 5", semver@^5.5.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
- integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
-semver@7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
- integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
-
-semver@7.5.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.6:
- version "7.5.2"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.2.tgz#5b851e66d1be07c1cdaf37dfc856f543325a2beb"
- integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==
- dependencies:
- lru-cache "^6.0.0"
-
-semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
- integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-
-semver@^7.5.3:
- version "7.6.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.1.tgz#60bfe090bf907a25aa8119a72b9f90ef7ca281b2"
- integrity sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==
-
-semver@^7.6.0:
- version "7.6.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
- integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
- dependencies:
- lru-cache "^6.0.0"
-
-send@0.18.0:
- version "0.18.0"
- resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
- integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
- dependencies:
- debug "2.6.9"
- depd "2.0.0"
- destroy "1.2.0"
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- etag "~1.8.1"
- fresh "0.5.2"
- http-errors "2.0.0"
- mime "1.6.0"
- ms "2.1.3"
- on-finished "2.4.1"
- range-parser "~1.2.1"
- statuses "2.0.1"
-
-send@0.19.0:
- version "0.19.0"
- resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
- integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
- dependencies:
- debug "2.6.9"
- depd "2.0.0"
- destroy "1.2.0"
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- etag "~1.8.1"
- fresh "0.5.2"
- http-errors "2.0.0"
- mime "1.6.0"
- ms "2.1.3"
- on-finished "2.4.1"
- range-parser "~1.2.1"
- statuses "2.0.1"
-
-serialize-javascript@6.0.0, serialize-javascript@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
- integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
- dependencies:
- randombytes "^2.1.0"
-
-serialize-javascript@^6.0.1:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2"
- integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==
- dependencies:
- randombytes "^2.1.0"
-
-serve-static@1.16.0:
- version "1.16.0"
- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.0.tgz#2bf4ed49f8af311b519c46f272bf6ac3baf38a92"
- integrity sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==
- dependencies:
- encodeurl "~1.0.2"
- escape-html "~1.0.3"
- parseurl "~1.3.3"
- send "0.18.0"
-
-set-blocking@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
- integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
-
-set-function-length@^1.2.1:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
- integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
- dependencies:
- define-data-property "^1.1.4"
- es-errors "^1.3.0"
- function-bind "^1.1.2"
- get-intrinsic "^1.2.4"
- gopd "^1.0.1"
- has-property-descriptors "^1.0.2"
-
-set-function-name@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
- integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
- dependencies:
- define-data-property "^1.1.4"
- es-errors "^1.3.0"
- functions-have-names "^1.2.3"
- has-property-descriptors "^1.0.2"
-
-setprototypeof@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
- integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
-
-shallow-clone@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
- integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
- dependencies:
- kind-of "^6.0.2"
-
-shebang-command@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
- integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==
- dependencies:
- shebang-regex "^1.0.0"
-
-shebang-command@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
- integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
- dependencies:
- shebang-regex "^3.0.0"
-
-shebang-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
- integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==
-
-shebang-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
- integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-
-shell-quote@^1.6.1:
- version "1.7.3"
- resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123"
- integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==
-
-side-channel@^1.0.4, side-channel@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
- integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
- dependencies:
- call-bind "^1.0.7"
- es-errors "^1.3.0"
- get-intrinsic "^1.2.4"
- object-inspect "^1.13.1"
-
-signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
- version "3.0.7"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
- integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
-
-signal-exit@^4.0.1:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
- integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
-
-simple-concat@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
- integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
-
-simple-get@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
- integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
- dependencies:
- decompress-response "^6.0.0"
- once "^1.3.1"
- simple-concat "^1.0.0"
-
-sinon@13.0.2:
- version "13.0.2"
- resolved "https://registry.yarnpkg.com/sinon/-/sinon-13.0.2.tgz#c6a8ddd655dc1415bbdc5ebf0e5b287806850c3a"
- integrity sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==
- dependencies:
- "@sinonjs/commons" "^1.8.3"
- "@sinonjs/fake-timers" "^9.1.2"
- "@sinonjs/samsam" "^6.1.1"
- diff "^5.0.0"
- nise "^5.1.1"
- supports-color "^7.2.0"
-
-sinon@^9.0.3:
- version "9.2.4"
- resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.4.tgz#e55af4d3b174a4443a8762fa8421c2976683752b"
- integrity sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==
- dependencies:
- "@sinonjs/commons" "^1.8.1"
- "@sinonjs/fake-timers" "^6.0.1"
- "@sinonjs/samsam" "^5.3.1"
- diff "^4.0.2"
- nise "^4.0.4"
- supports-color "^7.1.0"
-
-slash@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
- integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-
-slash@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
- integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
-
-slice-ansi@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
- integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
- dependencies:
- ansi-styles "^4.0.0"
- astral-regex "^2.0.0"
- is-fullwidth-code-point "^3.0.0"
-
-smart-buffer@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
- integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
-
-socket.io-adapter@~2.5.2:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12"
- integrity sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==
- dependencies:
- ws "~8.11.0"
-
-socket.io-client@4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.5.0.tgz#3858b6183bab31c5c4eaf3efd0fa50840ebb4504"
- integrity sha512-HW61c1G7OrYGxaI79WRn17+b03iBCdvhBj4iqyXHBoL5M8w2MSO/vChsjA93knG4GYEai1/vbXWJna9dzxXtSg==
- dependencies:
- "@socket.io/component-emitter" "~3.1.0"
- debug "~4.3.2"
- engine.io-client "~6.2.1"
- socket.io-parser "~4.2.0"
-
-socket.io-parser@~4.2.0:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.3.tgz#926bcc6658e2ae0883dc9dee69acbdc76e4e3667"
- integrity sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==
- dependencies:
- "@socket.io/component-emitter" "~3.1.0"
- debug "~4.3.1"
-
-socket.io-parser@~4.2.4:
- version "4.2.4"
- resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83"
- integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==
- dependencies:
- "@socket.io/component-emitter" "~3.1.0"
- debug "~4.3.1"
-
-socket.io@4.6.2:
- version "4.6.2"
- resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.6.2.tgz#d597db077d4df9cbbdfaa7a9ed8ccc3d49439786"
- integrity sha512-Vp+lSks5k0dewYTfwgPT9UeGGd+ht7sCpB7p0e83VgO4X/AHYWhXITMrNk/pg8syY2bpx23ptClCQuHhqi2BgQ==
- dependencies:
- accepts "~1.3.4"
- base64id "~2.0.0"
- debug "~4.3.2"
- engine.io "~6.4.2"
- socket.io-adapter "~2.5.2"
- socket.io-parser "~4.2.4"
-
-socks-proxy-agent@^6.0.0:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz#2687a31f9d7185e38d530bef1944fe1f1496d6ce"
- integrity sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==
- dependencies:
- agent-base "^6.0.2"
- debug "^4.3.3"
- socks "^2.6.2"
-
-socks@^2.6.2:
- version "2.7.0"
- resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.0.tgz#f9225acdb841e874dca25f870e9130990f3913d0"
- integrity sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==
- dependencies:
- ip "^2.0.0"
- smart-buffer "^4.2.0"
-
-socks@^2.8.3:
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5"
- integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==
- dependencies:
- ip-address "^9.0.5"
- smart-buffer "^4.2.0"
-
-sortablejs@1.15.2:
- version "1.15.2"
- resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.15.2.tgz#4e9f7bda4718bd1838add9f1866ec77169149809"
- integrity sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==
-
-source-map-js@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
- integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
-
-source-map-js@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
- integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
-
-source-map-support@~0.5.20:
- version "0.5.21"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
- integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
- dependencies:
- buffer-from "^1.0.0"
- source-map "^0.6.0"
-
-source-map@^0.6.0, source-map@^0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
- integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-
-sourcemap-codec@^1.4.8:
- version "1.4.8"
- resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
- integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
-
-spawn-wrap@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e"
- integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==
- dependencies:
- foreground-child "^2.0.0"
- is-windows "^1.0.2"
- make-dir "^3.0.0"
- rimraf "^3.0.0"
- signal-exit "^3.0.2"
- which "^2.0.1"
-
-spdx-correct@^3.0.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
- integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
- dependencies:
- spdx-expression-parse "^3.0.0"
- spdx-license-ids "^3.0.0"
-
-spdx-exceptions@^2.1.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
- integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
-
-spdx-expression-parse@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
- integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
- dependencies:
- spdx-exceptions "^2.1.0"
- spdx-license-ids "^3.0.0"
-
-spdx-license-ids@^3.0.0:
- version "3.0.11"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95"
- integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==
-
-specificity@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019"
- integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==
-
-sprintf-js@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
- integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==
-
-sprintf-js@~1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
- integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
-
-sqlite3@5.1.7:
- version "5.1.7"
- resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.1.7.tgz#59ca1053c1ab38647396586edad019b1551041b7"
- integrity sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==
- dependencies:
- bindings "^1.5.0"
- node-addon-api "^7.0.0"
- prebuild-install "^7.1.1"
- tar "^6.1.11"
- optionalDependencies:
- node-gyp "8.x"
-
-ssri@^8.0.0, ssri@^8.0.1:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af"
- integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==
- dependencies:
- minipass "^3.1.1"
-
-stable@^0.1.8:
- version "0.1.8"
- resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
- integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
-
-statuses@2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
- integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
-
-stream-browserify@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f"
- integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==
- dependencies:
- inherits "~2.0.4"
- readable-stream "^3.5.0"
-
-"string-width-cjs@npm:string-width@^4.2.0":
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
- integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
- dependencies:
- emoji-regex "^8.0.0"
- is-fullwidth-code-point "^3.0.0"
- strip-ansi "^6.0.1"
-
-"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
- integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
- dependencies:
- emoji-regex "^8.0.0"
- is-fullwidth-code-point "^3.0.0"
- strip-ansi "^6.0.1"
-
-string-width@^5.0.1, string-width@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
- integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
- dependencies:
- eastasianwidth "^0.2.0"
- emoji-regex "^9.2.2"
- strip-ansi "^7.0.1"
-
-string.prototype.padend@^3.0.0:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1"
- integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==
- dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
- es-abstract "^1.19.1"
-
-string.prototype.trim@^1.2.9:
- version "1.2.9"
- resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
- integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==
- dependencies:
- call-bind "^1.0.7"
- define-properties "^1.2.1"
- es-abstract "^1.23.0"
- es-object-atoms "^1.0.0"
-
-string.prototype.trimend@^1.0.5, string.prototype.trimend@^1.0.8:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229"
- integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==
- dependencies:
- call-bind "^1.0.7"
- define-properties "^1.2.1"
- es-object-atoms "^1.0.0"
-
-string.prototype.trimstart@^1.0.5, string.prototype.trimstart@^1.0.8:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
- integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
- dependencies:
- call-bind "^1.0.7"
- define-properties "^1.2.1"
- es-object-atoms "^1.0.0"
-
-string_decoder@^1.1.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
- dependencies:
- safe-buffer "~5.2.0"
-
-"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
- integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
- dependencies:
- ansi-regex "^5.0.1"
-
-strip-ansi@^6.0.0, strip-ansi@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
- integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
- dependencies:
- ansi-regex "^5.0.1"
-
-strip-ansi@^7.0.1:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
- integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
- dependencies:
- ansi-regex "^6.0.1"
-
-strip-bom@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
- integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
-
-strip-bom@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
- integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
-
-strip-final-newline@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
- integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
-
-strip-indent@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
- integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
- dependencies:
- min-indent "^1.0.0"
-
-strip-json-comments@3.1.1, strip-json-comments@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
- integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
-
-strip-json-comments@~2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
- integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
-
-strip-outer@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
- integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==
- dependencies:
- escape-string-regexp "^1.0.2"
-
-strtok3@^6.2.4:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.3.0.tgz#358b80ffe6d5d5620e19a073aa78ce947a90f9a0"
- integrity sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==
- dependencies:
- "@tokenizer/token" "^0.3.0"
- peek-readable "^4.1.0"
-
-style-search@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
- integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==
-
-stylehacks@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520"
- integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==
- dependencies:
- browserslist "^4.16.6"
- postcss-selector-parser "^6.0.4"
-
-stylelint-config-recommended@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz#fd2523a322836005ad9bf473d3e5534719c09f9d"
- integrity sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw==
-
-stylelint-config-standard@24.0.0:
- version "24.0.0"
- resolved "https://registry.yarnpkg.com/stylelint-config-standard/-/stylelint-config-standard-24.0.0.tgz#6823f207ab997ae0b641f9a636d007cc44d77541"
- integrity sha512-+RtU7fbNT+VlNbdXJvnjc3USNPZRiRVp/d2DxOF/vBDDTi0kH5RX2Ny6errdtZJH3boO+bmqIYEllEmok4jiuw==
- dependencies:
- stylelint-config-recommended "^6.0.0"
-
-stylelint@14.3.0:
- version "14.3.0"
- resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.3.0.tgz#26b62730da7b3dc320021fc469d80048d7b77ebe"
- integrity sha512-PZXSwtJe4f4qBPWBwAbHL0M0Qjrv8iHN+cLpUNsffaVMS3YzpDDRI73+2lsqLAYfQEzxRwpll6BDKImREbpHWA==
- dependencies:
- balanced-match "^2.0.0"
- colord "^2.9.2"
- cosmiconfig "^7.0.1"
- debug "^4.3.3"
- execall "^2.0.0"
- fast-glob "^3.2.11"
- fastest-levenshtein "^1.0.12"
- file-entry-cache "^6.0.1"
- get-stdin "^8.0.0"
- global-modules "^2.0.0"
- globby "^11.1.0"
- globjoin "^0.1.4"
- html-tags "^3.1.0"
- ignore "^5.2.0"
- import-lazy "^4.0.0"
- imurmurhash "^0.1.4"
- is-plain-object "^5.0.0"
- known-css-properties "^0.24.0"
- mathml-tag-names "^2.1.3"
- meow "^9.0.0"
- micromatch "^4.0.4"
- normalize-path "^3.0.0"
- normalize-selector "^0.2.0"
- picocolors "^1.0.0"
- postcss "^8.4.5"
- postcss-media-query-parser "^0.2.3"
- postcss-resolve-nested-selector "^0.1.1"
- postcss-safe-parser "^6.0.0"
- postcss-selector-parser "^6.0.9"
- postcss-value-parser "^4.2.0"
- resolve-from "^5.0.0"
- specificity "^0.4.1"
- string-width "^4.2.3"
- strip-ansi "^6.0.1"
- style-search "^0.1.0"
- supports-hyperlinks "^2.2.0"
- svg-tags "^1.0.0"
- table "^6.8.0"
- v8-compile-cache "^2.3.0"
- write-file-atomic "^4.0.0"
-
-supports-color@8.1.1, supports-color@^8.0.0:
- version "8.1.1"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
- integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
- dependencies:
- has-flag "^4.0.0"
-
-supports-color@^5.3.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
- integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
- dependencies:
- has-flag "^3.0.0"
-
-supports-color@^7.0.0, supports-color@^7.1.0, supports-color@^7.2.0:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
- integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
- dependencies:
- has-flag "^4.0.0"
-
-supports-hyperlinks@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb"
- integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==
- dependencies:
- has-flag "^4.0.0"
- supports-color "^7.0.0"
-
-supports-preserve-symlinks-flag@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
- integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
-
-svg-tags@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
- integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==
-
-svgo@^2.7.0:
- version "2.8.0"
- resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24"
- integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==
- dependencies:
- "@trysound/sax" "0.2.0"
- commander "^7.2.0"
- css-select "^4.1.3"
- css-tree "^1.1.3"
- csso "^4.2.0"
- picocolors "^1.0.0"
- stable "^0.1.8"
-
-table@^6.8.0:
- version "6.8.0"
- resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca"
- integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==
- dependencies:
- ajv "^8.0.1"
- lodash.truncate "^4.4.2"
- slice-ansi "^4.0.0"
- string-width "^4.2.3"
- strip-ansi "^6.0.1"
-
-tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
- integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
-
-tar-fs@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
- integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
- dependencies:
- chownr "^1.1.1"
- mkdirp-classic "^0.5.2"
- pump "^3.0.0"
- tar-stream "^2.1.4"
-
-tar-stream@^2.1.4:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
- integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
- dependencies:
- bl "^4.0.3"
- end-of-stream "^1.4.1"
- fs-constants "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^3.1.1"
-
-tar@^6.0.2, tar@^6.1.11, tar@^6.1.2:
- version "6.1.11"
- resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
- integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
- dependencies:
- chownr "^2.0.0"
- fs-minipass "^2.0.0"
- minipass "^3.0.0"
- minizlib "^2.1.1"
- mkdirp "^1.0.3"
- yallist "^4.0.0"
-
-terser-webpack-plugin@^5.1.3:
- version "5.3.3"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90"
- integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==
- dependencies:
- "@jridgewell/trace-mapping" "^0.3.7"
- jest-worker "^27.4.5"
- schema-utils "^3.1.1"
- serialize-javascript "^6.0.0"
- terser "^5.7.2"
-
-terser-webpack-plugin@^5.3.10:
- version "5.3.10"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199"
- integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==
- dependencies:
- "@jridgewell/trace-mapping" "^0.3.20"
- jest-worker "^27.4.5"
- schema-utils "^3.1.1"
- serialize-javascript "^6.0.1"
- terser "^5.26.0"
-
-terser@^5.26.0:
- version "5.31.6"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.6.tgz#c63858a0f0703988d0266a82fcbf2d7ba76422b1"
- integrity sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==
- dependencies:
- "@jridgewell/source-map" "^0.3.3"
- acorn "^8.8.2"
- commander "^2.20.0"
- source-map-support "~0.5.20"
-
-terser@^5.7.2:
- version "5.14.2"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10"
- integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==
- dependencies:
- "@jridgewell/source-map" "^0.3.2"
- acorn "^8.5.0"
- commander "^2.20.0"
- source-map-support "~0.5.20"
-
-test-exclude@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
- integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
- dependencies:
- "@istanbuljs/schema" "^0.1.2"
- glob "^7.1.4"
- minimatch "^3.0.4"
-
-text-decoding@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/text-decoding/-/text-decoding-1.0.0.tgz#38a5692d23b5c2b12942d6e245599cb58b1bc52f"
- integrity sha512-/0TJD42KDnVwKmDK6jj3xP7E2MG7SHAOG4tyTgyUCRPdHwvkquYNLEQltmdMa3owq3TkddCVcTsoctJI8VQNKA==
-
-text-table@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
- integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
-
-textarea-caret@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/textarea-caret/-/textarea-caret-3.1.0.tgz#5d5a35bb035fd06b2ff0e25d5359e97f2655087f"
- integrity sha512-cXAvzO9pP5CGa6NKx0WYHl+8CHKZs8byMkt3PCJBCmq2a34YA9pO1NrQET5pzeqnBjBdToF5No4rrmkDUgQC2Q==
-
-tlds@1.228.0:
- version "1.228.0"
- resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.228.0.tgz#416ab76ac1a06aad0b5d6b484a13bf5a0ad63f39"
- integrity sha512-Q0TU9zh5hDs2CpRFNM7SOW3K7OSgUgJC/cMrq9t44ei4tu+G3KV8BZyIJuYVvryJHH96mKgc9WXdhgKVvGD7jg==
-
-to-fast-properties@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
- integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
-
-to-regex-range@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
- integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
- dependencies:
- is-number "^7.0.0"
-
-toidentifier@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
- integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
-
-token-types@^4.1.1:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.2.0.tgz#b66bc3d67420c6873222a424eee64a744f4c2f13"
- integrity sha512-P0rrp4wUpefLncNamWIef62J0v0kQR/GfDVji9WKY7GDCWy5YbVSrKUTam07iWPZQGy0zWNOfstYTykMmPNR7w==
- dependencies:
- "@tokenizer/token" "^0.3.0"
- ieee754 "^1.2.1"
-
-trim-newlines@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
- integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==
-
-trim-repeated@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
- integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==
- dependencies:
- escape-string-regexp "^1.0.2"
-
-ts-api-utils@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1"
- integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==
-
-ts-loader@9.3.0:
- version "9.3.0"
- resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.0.tgz#980f4dbfb60e517179e15e10ed98e454b132159f"
- integrity sha512-2kLLAdAD+FCKijvGKi9sS0OzoqxLCF3CxHpok7rVgCZ5UldRzH0TkbwG9XECKjBzHsAewntC5oDaI/FwKzEUog==
- dependencies:
- chalk "^4.1.0"
- enhanced-resolve "^5.0.0"
- micromatch "^4.0.0"
- semver "^7.3.4"
-
-ts-node@10.7.0:
- version "10.7.0"
- resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5"
- integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==
- dependencies:
- "@cspotcode/source-map-support" "0.7.0"
- "@tsconfig/node10" "^1.0.7"
- "@tsconfig/node12" "^1.0.7"
- "@tsconfig/node14" "^1.0.0"
- "@tsconfig/node16" "^1.0.2"
- acorn "^8.4.1"
- acorn-walk "^8.1.1"
- arg "^4.1.0"
- create-require "^1.1.0"
- diff "^4.0.1"
- make-error "^1.1.1"
- v8-compile-cache-lib "^3.0.0"
- yn "3.1.1"
-
-ts-sinon@2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/ts-sinon/-/ts-sinon-2.0.2.tgz#9e020ad1e76b41e71cb7344b71923dbc3c6bc7ca"
- integrity sha512-Eh6rXPQruACHPn+/e5HsIMaHZa17tGP/scGjUeW5eJ/Levn8hBV6zSP/6QkEDUP7wLkTyY0yeYikjpTzgC9Gew==
- dependencies:
- "@types/node" "^14.6.1"
- "@types/sinon" "^9.0.5"
- "@types/sinon-chai" "^3.2.4"
- sinon "^9.0.3"
-
-tunnel-agent@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
- integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
- dependencies:
- safe-buffer "^5.0.1"
-
-type-check@^0.4.0, type-check@~0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
- integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
- dependencies:
- prelude-ls "^1.2.1"
-
-type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8:
- version "4.0.8"
- resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
- integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
-
-type-fest@^0.18.0:
- version "0.18.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f"
- integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==
-
-type-fest@^0.20.2:
- version "0.20.2"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
- integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
-
-type-fest@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
- integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
-
-type-fest@^0.8.0, type-fest@^0.8.1:
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
- integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
-
-type-is@~1.6.18:
- version "1.6.18"
- resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
- integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
- dependencies:
- media-typer "0.3.0"
- mime-types "~2.1.24"
-
-typed-array-buffer@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3"
- integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==
- dependencies:
- call-bind "^1.0.7"
- es-errors "^1.3.0"
- is-typed-array "^1.1.13"
-
-typed-array-byte-length@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67"
- integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==
- dependencies:
- call-bind "^1.0.7"
- for-each "^0.3.3"
- gopd "^1.0.1"
- has-proto "^1.0.3"
- is-typed-array "^1.1.13"
-
-typed-array-byte-offset@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063"
- integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
- dependencies:
- available-typed-arrays "^1.0.7"
- call-bind "^1.0.7"
- for-each "^0.3.3"
- gopd "^1.0.1"
- has-proto "^1.0.3"
- is-typed-array "^1.1.13"
-
-typed-array-length@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3"
- integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
- dependencies:
- call-bind "^1.0.7"
- for-each "^0.3.3"
- gopd "^1.0.1"
- has-proto "^1.0.3"
- is-typed-array "^1.1.13"
- possible-typed-array-names "^1.0.0"
-
-typedarray-to-buffer@^3.1.5:
- version "3.1.5"
- resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
- integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
- dependencies:
- is-typedarray "^1.0.0"
-
-typescript@5.4.5:
- version "5.4.5"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611"
- integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==
-
-ua-parser-js@1.0.39:
- version "1.0.39"
- resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018"
- integrity sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==
-
-uc.micro@^1.0.1:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
- integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
-
-unbox-primitive@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
- integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
- dependencies:
- call-bind "^1.0.2"
- has-bigints "^1.0.2"
- has-symbols "^1.0.3"
- which-boxed-primitive "^1.0.2"
-
-undate@0.3.0, undate@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/undate/-/undate-0.3.0.tgz#cbf6b1f179d69ace7393e6d92400c3afdf43d140"
- integrity sha512-ssH8QTNBY6B+2fRr3stSQ+9m2NT8qTaun3ExTx5ibzYQvP7yX4+BnX0McNxFCvh6S5ia/DYu6bsCKQx/U4nb/Q==
-
-undici@^6.19.5:
- version "6.19.8"
- resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.8.tgz#002d7c8a28f8cc3a44ff33c3d4be4d85e15d40e1"
- integrity sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==
-
-unicode-canonical-property-names-ecmascript@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
- integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
-
-unicode-match-property-ecmascript@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
- integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
- dependencies:
- unicode-canonical-property-names-ecmascript "^2.0.0"
- unicode-property-aliases-ecmascript "^2.0.0"
-
-unicode-match-property-value-ecmascript@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714"
- integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==
-
-unicode-property-aliases-ecmascript@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8"
- integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==
-
-unique-filename@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
- integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
- dependencies:
- unique-slug "^2.0.0"
-
-unique-slug@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
- integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
- dependencies:
- imurmurhash "^0.1.4"
-
-universalify@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
- integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
-
-unpipe@1.0.0, unpipe@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
- integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
-
-update-browserslist-db@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38"
- integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==
- dependencies:
- escalade "^3.1.1"
- picocolors "^1.0.0"
-
-update-browserslist-db@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e"
- integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==
- dependencies:
- escalade "^3.1.2"
- picocolors "^1.0.1"
-
-uri-js@^4.2.2:
- version "4.4.1"
- resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
- integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
- dependencies:
- punycode "^2.1.0"
-
-urlsafe-base64@^1.0.0, urlsafe-base64@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/urlsafe-base64/-/urlsafe-base64-1.0.0.tgz#23f89069a6c62f46cf3a1d3b00169cefb90be0c6"
- integrity sha512-RtuPeMy7c1UrHwproMZN9gN6kiZ0SvJwRaEzwZY0j9MypEkFqyBaKv176jvlPtg58Zh36bOkS0NFABXMHvvGCA==
-
-util-deprecate@^1.0.1, util-deprecate@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
- integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
-
-util@^0.12.5:
- version "0.12.5"
- resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc"
- integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==
- dependencies:
- inherits "^2.0.3"
- is-arguments "^1.0.4"
- is-generator-function "^1.0.7"
- is-typed-array "^1.1.3"
- which-typed-array "^1.1.2"
-
-utils-merge@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
- integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
-
-uuid@8.3.2, uuid@^8.3.2:
- version "8.3.2"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
- integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
-
-v8-compile-cache-lib@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
- integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
-
-v8-compile-cache@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
- integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
-
-validate-npm-package-license@^3.0.1:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
- integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
- dependencies:
- spdx-correct "^3.0.0"
- spdx-expression-parse "^3.0.0"
-
-vary@^1, vary@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
- integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
-
-vasync@^2.2.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/vasync/-/vasync-2.2.1.tgz#d881379ff3685e4affa8e775cf0fd369262a201b"
- integrity sha512-Hq72JaTpcTFdWiNA4Y22Amej2GH3BFmBaKPPlDZ4/oC8HNn2ISHLkFrJU4Ds8R3jcUi7oo5Y9jcMHKjES+N9wQ==
- dependencies:
- verror "1.10.0"
-
-verror@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
- integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==
- dependencies:
- assert-plus "^1.0.0"
- core-util-is "1.0.2"
- extsprintf "^1.2.0"
-
-verror@^1.8.1:
- version "1.10.1"
- resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb"
- integrity sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==
- dependencies:
- assert-plus "^1.0.0"
- core-util-is "1.0.2"
- extsprintf "^1.2.0"
-
-vue-component-type-helpers@^2.0.0:
- version "2.0.16"
- resolved "https://registry.yarnpkg.com/vue-component-type-helpers/-/vue-component-type-helpers-2.0.16.tgz#bfdb9cba265dca097b0f3411baeae879e008c33d"
- integrity sha512-qisL/iAfdO++7w+SsfYQJVPj6QKvxp4i1MMxvsNO41z/8zu3KuAw9LkhKUfP/kcOWGDxESp+pQObWppXusejCA==
-
-vue-eslint-parser@9.4.3:
- version "9.4.3"
- resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz#9b04b22c71401f1e8bca9be7c3e3416a4bde76a8"
- integrity sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==
- dependencies:
- debug "^4.3.4"
- eslint-scope "^7.1.1"
- eslint-visitor-keys "^3.3.0"
- espree "^9.3.1"
- esquery "^1.4.0"
- lodash "^4.17.21"
- semver "^7.3.6"
-
-vue-eslint-parser@^9.4.2:
- version "9.4.2"
- resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz#02ffcce82042b082292f2d1672514615f0d95b6d"
- integrity sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==
- dependencies:
- debug "^4.3.4"
- eslint-scope "^7.1.1"
- eslint-visitor-keys "^3.3.0"
- espree "^9.3.1"
- esquery "^1.4.0"
- lodash "^4.17.21"
- semver "^7.3.6"
-
-vue-loader@17.0.1:
- version "17.0.1"
- resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-17.0.1.tgz#c0ee8875e0610a0c2d13ba9b4d50a9c8442e7a3a"
- integrity sha512-/OOyugJnImKCkAKrAvdsWMuwoCqGxWT5USLsjohzWbMgOwpA5wQmzQiLMzZd7DjhIfunzAGIApTOgIylz/kwcg==
- dependencies:
- chalk "^4.1.0"
- hash-sum "^2.0.0"
- loader-utils "^2.0.0"
-
-vue-router@4.0.15:
- version "4.0.15"
- resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.0.15.tgz#b4a0661efe197f8c724e0f233308f8776e2c3667"
- integrity sha512-xa+pIN9ZqORdIW1MkN2+d9Ui2pCM1b/UMgwYUCZOiFYHAvz/slKKBDha8DLrh5aCG/RibtrpyhKjKOZ85tYyWg==
- dependencies:
- "@vue/devtools-api" "^6.0.0"
-
-vue@3.2.35:
- version "3.2.35"
- resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.35.tgz#e0a63a8b2fcc0334a936d484d646e31b571e3f80"
- integrity sha512-mc/15B0Wjd/4JMMGOcXUQAeXfjyg8MImA2EVZucNdyDPJe1nXhMNbYXOEVPEGfk/mCeyszCzl44dSAhHhQVH8g==
- dependencies:
- "@vue/compiler-dom" "3.2.35"
- "@vue/compiler-sfc" "3.2.35"
- "@vue/runtime-dom" "3.2.35"
- "@vue/server-renderer" "3.2.35"
- "@vue/shared" "3.2.35"
-
-vuex@4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/vuex/-/vuex-4.0.2.tgz#f896dbd5bf2a0e963f00c67e9b610de749ccacc9"
- integrity sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==
- dependencies:
- "@vue/devtools-api" "^6.0.0-beta.11"
-
-watchpack@^2.3.1:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
- integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==
- dependencies:
- glob-to-regexp "^0.4.1"
- graceful-fs "^4.1.2"
-
-watchpack@^2.4.1:
- version "2.4.2"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da"
- integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==
- dependencies:
- glob-to-regexp "^0.4.1"
- graceful-fs "^4.1.2"
-
-web-push@3.4.5:
- version "3.4.5"
- resolved "https://registry.yarnpkg.com/web-push/-/web-push-3.4.5.tgz#f94074ff150538872c7183e4d8881c8305920cf1"
- integrity sha512-2njbTqZ6Q7ZqqK14YpK1GGmaZs3NmuGYF5b7abCXulUIWFSlSYcZ3NBJQRFcMiQDceD7vQknb8FUuvI1F7Qe/g==
- dependencies:
- asn1.js "^5.3.0"
- http_ece "1.1.0"
- https-proxy-agent "^5.0.0"
- jws "^4.0.0"
- minimist "^1.2.5"
- urlsafe-base64 "^1.0.0"
-
-webpack-cli@4.9.2:
- version "4.9.2"
- resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d"
- integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==
- dependencies:
- "@discoveryjs/json-ext" "^0.5.0"
- "@webpack-cli/configtest" "^1.1.1"
- "@webpack-cli/info" "^1.4.1"
- "@webpack-cli/serve" "^1.6.1"
- colorette "^2.0.14"
- commander "^7.0.0"
- execa "^5.0.0"
- fastest-levenshtein "^1.0.12"
- import-local "^3.0.2"
- interpret "^2.2.0"
- rechoir "^0.7.0"
- webpack-merge "^5.7.3"
-
-webpack-dev-middleware@5.3.4:
- version "5.3.4"
- resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517"
- integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==
- dependencies:
- colorette "^2.0.10"
- memfs "^3.4.3"
- mime-types "^2.1.31"
- range-parser "^1.2.1"
- schema-utils "^4.0.0"
-
-webpack-hot-middleware@2.25.4:
- version "2.25.4"
- resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.4.tgz#d8bc9e9cb664fc3105c8e83d2b9ed436bee4e193"
- integrity sha512-IRmTspuHM06aZh98OhBJtqLpeWFM8FXJS5UYpKYxCJzyFoyWj1w6VGFfomZU7OPA55dMLrQK0pRT1eQ3PACr4w==
- dependencies:
- ansi-html-community "0.0.8"
- html-entities "^2.1.0"
- strip-ansi "^6.0.0"
-
-webpack-merge@^5.7.3:
- version "5.8.0"
- resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61"
- integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==
- dependencies:
- clone-deep "^4.0.1"
- wildcard "^2.0.0"
-
-webpack-sources@^3.2.3:
- version "3.2.3"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
- integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
-
-webpack@5.94.0:
- version "5.94.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.94.0.tgz#77a6089c716e7ab90c1c67574a28da518a20970f"
- integrity sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==
- dependencies:
- "@types/estree" "^1.0.5"
- "@webassemblyjs/ast" "^1.12.1"
- "@webassemblyjs/wasm-edit" "^1.12.1"
- "@webassemblyjs/wasm-parser" "^1.12.1"
- acorn "^8.7.1"
- acorn-import-attributes "^1.9.5"
- browserslist "^4.21.10"
- chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.17.1"
- es-module-lexer "^1.2.1"
- eslint-scope "5.1.1"
- events "^3.2.0"
- glob-to-regexp "^0.4.1"
- graceful-fs "^4.2.11"
- json-parse-even-better-errors "^2.3.1"
- loader-runner "^4.2.0"
- mime-types "^2.1.27"
- neo-async "^2.6.2"
- schema-utils "^3.2.0"
- tapable "^2.1.1"
- terser-webpack-plugin "^5.3.10"
- watchpack "^2.4.1"
- webpack-sources "^3.2.3"
-
-webpack@^5:
- version "5.73.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38"
- integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==
- dependencies:
- "@types/eslint-scope" "^3.7.3"
- "@types/estree" "^0.0.51"
- "@webassemblyjs/ast" "1.11.1"
- "@webassemblyjs/wasm-edit" "1.11.1"
- "@webassemblyjs/wasm-parser" "1.11.1"
- acorn "^8.4.1"
- acorn-import-assertions "^1.7.6"
- browserslist "^4.14.5"
- chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.9.3"
- es-module-lexer "^0.9.0"
- eslint-scope "5.1.1"
- events "^3.2.0"
- glob-to-regexp "^0.4.1"
- graceful-fs "^4.2.9"
- json-parse-even-better-errors "^2.3.1"
- loader-runner "^4.2.0"
- mime-types "^2.1.27"
- neo-async "^2.6.2"
- schema-utils "^3.1.0"
- tapable "^2.1.1"
- terser-webpack-plugin "^5.1.3"
- watchpack "^2.3.1"
- webpack-sources "^3.2.3"
-
-whatwg-encoding@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5"
- integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==
- dependencies:
- iconv-lite "0.6.3"
-
-whatwg-mimetype@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a"
- integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==
-
-which-boxed-primitive@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
- integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
- dependencies:
- is-bigint "^1.0.1"
- is-boolean-object "^1.1.0"
- is-number-object "^1.0.4"
- is-string "^1.0.5"
- is-symbol "^1.0.3"
-
-which-module@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
- integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==
-
-which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2:
- version "1.1.15"
- resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
- integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
- dependencies:
- available-typed-arrays "^1.0.7"
- call-bind "^1.0.7"
- for-each "^0.3.3"
- gopd "^1.0.1"
- has-tostringtag "^1.0.2"
-
-which@2.0.2, which@^2.0.1, which@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
- integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
- dependencies:
- isexe "^2.0.0"
-
-which@^1.2.9, which@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
- integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
- dependencies:
- isexe "^2.0.0"
-
-wide-align@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
- integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
- dependencies:
- string-width "^1.0.2 || 2 || 3 || 4"
-
-wildcard@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
- integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
-
-with-open-file@^0.1.6:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/with-open-file/-/with-open-file-0.1.7.tgz#e2de8d974e8a8ae6e58886be4fe8e7465b58a729"
- integrity sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==
- dependencies:
- p-finally "^1.0.0"
- p-try "^2.1.0"
- pify "^4.0.1"
-
-word-wrap@^1.2.5:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
- integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
-
-workerpool@6.2.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b"
- integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==
-
-"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
- integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
- dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
-
-wrap-ansi@^6.2.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
- integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
- dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
-
-wrap-ansi@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
- integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
- dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
-
-wrap-ansi@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
- integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
- dependencies:
- ansi-styles "^6.1.0"
- string-width "^5.0.1"
- strip-ansi "^7.0.1"
-
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
-
-write-file-atomic@^3.0.0:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
- integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
- dependencies:
- imurmurhash "^0.1.4"
- is-typedarray "^1.0.0"
- signal-exit "^3.0.2"
- typedarray-to-buffer "^3.1.5"
-
-write-file-atomic@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f"
- integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==
- dependencies:
- imurmurhash "^0.1.4"
- signal-exit "^3.0.7"
-
-ws@~8.11.0:
- version "8.11.0"
- resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143"
- integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==
-
-ws@~8.2.3:
- version "8.2.3"
- resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"
- integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==
-
-xml-name-validator@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
- integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
-
-xmlhttprequest-ssl@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67"
- integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==
-
-y18n@^4.0.0:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
- integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
-
-y18n@^5.0.5:
- version "5.0.8"
- resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
- integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
-
-yallist@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
- integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-
-yaml@^1.10.0, yaml@^1.10.2:
- version "1.10.2"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
- integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
-
-yargs-parser@20.2.4:
- version "20.2.4"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
- integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
-
-yargs-parser@^18.1.2:
- version "18.1.3"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
- integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
- dependencies:
- camelcase "^5.0.0"
- decamelize "^1.2.0"
-
-yargs-parser@^20.2.2, yargs-parser@^20.2.3:
- version "20.2.9"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
- integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
-
-yargs-unparser@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
- integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
- dependencies:
- camelcase "^6.0.0"
- decamelize "^4.0.0"
- flat "^5.0.2"
- is-plain-obj "^2.1.0"
-
-yargs@16.2.0:
- version "16.2.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
- integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
- dependencies:
- cliui "^7.0.2"
- escalade "^3.1.1"
- get-caller-file "^2.0.5"
- require-directory "^2.1.1"
- string-width "^4.2.0"
- y18n "^5.0.5"
- yargs-parser "^20.2.2"
-
-yargs@^15.0.2:
- version "15.4.1"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
- integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
- dependencies:
- cliui "^6.0.0"
- decamelize "^1.2.0"
- find-up "^4.1.0"
- get-caller-file "^2.0.1"
- require-directory "^2.1.1"
- require-main-filename "^2.0.0"
- set-blocking "^2.0.0"
- string-width "^4.2.0"
- which-module "^2.0.0"
- y18n "^4.0.0"
- yargs-parser "^18.1.2"
-
-yarn@1.22.22:
- version "1.22.22"
- resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.22.tgz#ac34549e6aa8e7ead463a7407e1c7390f61a6610"
- integrity sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==
-
-yn@3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
- integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
-
-yocto-queue@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
- integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==